ZOJ 2072 Recursive Survival (约瑟夫问题)

也算是个数学问题,这个题在<<具体数学>>第一章第三节1.3 The Josephus Problem中有 详细讲解。

 

针对 这个题 来说,我第一次提交编译错误,然后查了查,发现问题出在__int64上,zoj不支持它,相应可以用long long来替换,改过之后,竟然TLE了,不可思议,这种简单计算竟然也会超时,我把测试数据的次数改成某个十几位的数,一运行,没结果,一看cpu占用率90%,好吧,它肯定在那计算着呢,我仔细想了想,可能有J(n)=n的情况,果不其然当n=(1111……1111)2 的时候。。。。。加入pre变量,如果前后结果一样,跳出》》具体原理参照书上吧。

 

#include<iostream> using namespace std; long long aa[64]; long long power(long long n) { long long t; if(n==0) return 1; if(n==1) return 2; if(n%2==0) return (t=power(n/2))*t; if(n%2==1) return (t=power((n-1)/2))*t*2; } int main() { long long a,i,n,pre; for(i = 0;i<=62;i++) aa[i] = power(i); while(cin>>a>>n) { while(n--) { pre = a; for(i = 0;i <= 61;i++) if(a>=aa[i] && a<aa[i+1]) break; if(a >= aa[62] ) i=62; a = (a-aa[i])*2+1; if(a==pre) break; } cout << a << endl; } return 0; }

你可能感兴趣的:(测试)