题意:有m个人抓n张牌,抓完后放回去,再抓,直到和原来一样为止,需要抓多少次排;
640000组数据,无语了 ,,,多了memset,直接超时
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define LL long long
int ini[809];
int map[809][809];
bool v[809];
int K;
inline LL ABS(LL a)
{
if(a<0) return -a;
return a;
}
LL kgcd(LL a, LL b)
{
if (a == 0) return b;
if (b == 0) return a;
if (!(a & 1) && !(b & 1)) return kgcd(a>>1, b>>1) << 1;
else if (!(b & 1)) return kgcd(a, b>>1);
else if (!(a & 1)) return kgcd(a>>1, b);
else return kgcd(ABS(a - b), min(a, b));
}
int main()
{
freopen("in.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m)&&(n+m))
{
int cnt = 1;
int i;
//memset(map,0,sizeof(map));
for(i=0;;i++)
{
for(int j=0;j<m;j++)
map[i][j] = cnt++;
if(cnt>n) break;
}
cnt = 1;
for(int j=0;j<m;j++)
{
for(int k=i;k>=0;k--)
if(map[k][j]<=n&&map[k][j])
ini[cnt++] = map[k][j];
}
long long A = 1;
memset(v,false,sizeof(v));
for(int i=1;i<=n;i++)
if(!v[i])
{
K = 0;
int t = i;
while(1)
{
if(v[t]) break;
v[t] = true;
K++;
t = ini[t];
}
A = A/kgcd(A,K)*K;
}
cout<<A<<endl;
}
return 0;
}