N=2: 0 N=3: 8 N=4: 64 N=5: 360 .. .. .. .. .. .. .. N=31: ... 注:根据Pku Judge Online 1351 Number of Locks或 Xi‘an 2002 改编,在那里N<=16
转载请注明出处:寻找&星空の孩子
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1438
/* 1:如果X是钥匙, 则X1/2/3/4也是, 所以a[I]=a[I-1]*4 2: 如果X不是, X2/3是则X由1/4组成, 但要除去全1和全4, 所以a[I]+=(2^(I-1)-2)*2 后缀2或者3加上就成为钥匙的话,必然是没满足需要3个不同深度槽这一项,故X必然由1/4组成 3 如果X不是 X1/4是。则X=Y(1/4) M=X1/4=Y(4/1)(1/4) 前I-2位可以是1234,但要除去全为1/4的情况 还有就是X是钥匙且X是以1/4结尾 的情况。我们用b[I]数组表示i位时以1/4结尾的的数量 temp=(4^(i-2)-2^(i-2))* 2 – b[i-1]; 则 b[i]=a[i-1]*2+temp; */ #include<stdio.h> #define LL long long #include<string.h> LL a[35],b[35]; LL ppow(LL n,LL m) { LL c=1; while(m) { if(m&1) c=c*n; n=n*n; m>>=1; } return c; } int main() { a[0]=a[1]=a[2]=0; b[0]=b[1]=b[2]=0; LL temp=0; printf("N=2: 0\n"); for(int i=3;i<=31;i++) { temp=(ppow(4,i-2)-ppow(2,i-2))*2-b[i-1]; // printf("temp=%lld\t",temp); b[i]=a[i-1]*2+temp; a[i]=a[i-1]*4+(ppow(2,i-1)-2)*2+temp; printf("N=%d: %lld\n",i,a[i]); } return 0; }
原文地址:http://blog.csdn.net/u010579068/article/details/46539539