Fzu_1062 洗牌问题

本题一看就是数学题,只是本人较笨,一开始用两个数组硬模拟,导致~~

 

后来发现规律:如果1在第k次回到首位,则k为正解

 

证明如下:

一次操作后,f(x)= {2x,(x<=n);(x-n)*2-1,(n

             =>f(x)=2x mod 2n+1

∵(a mod c)*b mod c=a*c mod b

∴f^k(x)=2^k*x mod 2n+1

当f^k(1)=2^k mod 2n+1=1时

对于任意m(1<=m<=2n)

都有f^k(m)=2^k*m mod 2n+1=m

……

#include int main() { int i,n,sum; while(scanf("%d",&n)!=EOF){ sum=1; i=2; while(i!=1){ if(i>n) i=(i-n)*2-1; else i*=2; sum++; } printf("%d/n",sum); } } 

你可能感兴趣的:(Fzu_1062 洗牌问题)