tjut 4896
2016-07-23 09:36
429 查看
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #define eps 1e-9 #define LL long long #define mod 2333333 using namespace std; map <int , int> ma; int pos[100]; int clo,p,ed; struct node { int x,y,w; }a[250000]; int f[500]; LL te[200]; int cmp(node a,node b) { return (a.w<b.w); } int getf(int x) { if (x==f[x]) return x; else return (f[x]=getf(f[x])); } int unite(int x,int y) { // printf("%d %d\n",x,y); if (getf(x)!=getf(y)) f[getf(x)]=getf(y); } LL kru() { LL ans=0; for (int i=1;i<=ed;i++) if (getf(a[i].x)!=getf(a[i].y)) { ans+=a[i].w; unite(a[i].x,a[i].y); } return ans; } int main() { LL n,seed; while (~scanf("%I64d%I64d",&n,&seed)) { ma.clear(); int cur=seed; int t=0; while (ma[cur]==0) { t++; pos[t]=cur; pos[0]=cur; ma[cur]=1; cur=cur*907%mod; } for (int k=1;k<=108;k++) { for (int i=1;i<=k;i++) f[i]=i; clo=ed=0; for (int i=1;i<=k;i++) { clo++; clo%=54; p=pos[clo]; for (int j=max(1,i-5);j<i;j++) { clo++; clo%=54; ed++; a[ed].x=i; a[ed].y=j; a[ed].w=pos[clo]^p; } } sort(a+1,a+1+ed,cmp); te[k]=kru();//暴力前108个结果 } // for (int i=1;i<=100;i++) // printf("%I64d ",te[i]); if (n<=108) printf("%I64d\n",te ); else printf("%I64d\n",te[54+n%54]+(n/54-1)*(te[108]-te[54])); } return 0; }
相关文章推荐
- 进制转换 hd 2031
- 拓扑排序
- 图形验证码的生成
- 安卓属性动画之插值器(TimeInterpolator)和估值器(TypeEvaluator)
- alter table <修改表>
- 写给自己的文章~前端开发实习总结
- javascript中confirm(确认),alert(警告),prompt(提问)的用法及其示例
- POJ1789 Truck History
- linux常用tar命令举例说明(新手可快速掌握)。
- hibernate 一对多查询对set的排序
- URAL 1970 J - 皇后像廣場 dfs
- 微信支付错误两个问题的解决:curl出错,错误码:60
- 侧边栏的动画效果
- Android常用5大布局
- springmvc上传文件
- linux - 对于双系统的用户来说,在磁盘分区变化之后需要进入系统并更新磁盘
- 创建存储过程
- 【杭电】[2124]Repair the Wall
- golang简单读写文件示例
- 测试询问框