给你n张卡片,分给k个人,从1-n轮流分。然后,重新把卡片放在一起。第1个人的放在最上边,后面的依次放下面。 再重新分,再放,问多少次后会恢复原样。

10 3
第一次
10 7 4 1 8 5 2 9 6 3
第二次
3 2 1 10 9 8 7 6 5 4
第三次
4 7 10 3 6 9 2 5 8 1
第四次
1 2 3 4 5 6 7 8 9 10

 

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #define LL long long
 6 using namespace std;
 7 int a[1000], vis[1000];
 8 LL gcd(LL a,LL b)
 9 {
10     return b==0?a:gcd(b,a%b);
11 }
12 int main()
13 {
14     int i,j,n,k,t;
15     while(~scanf("%d%d",&n,&k))
16     {
17         LL ans,sum=1;
18         if(n==0&&k==0)
19             break;
20         t=0;
21         for(i=0;i<k&&i<n;i++)
22             for(j=(n-i-1)/k*k+i;j>=0;j-=k)
23                 a[t++]=j;
24         memset(vis,0,sizeof(vis));
25         for(i=0;i<n;i++)
26         {
27             int x=i;
28             ans=0;
29             while(!vis[x])
30             {
31                 ans++;
32                 vis[x]=1;
33                 x=a[x];
34             }
35             if(ans)
36                 sum=sum/gcd(sum,ans)*ans;
37         }
38         printf("%I64d\n",sum);
39     }
40 }

 

 

 

posted on 2012-10-03 15:30  pony1993  阅读(207)  评论(0编辑  收藏  举报

View My Stats