1.使用暴力穷举法:注意条件判断
代码如下:
#include<stdio.h>
#include<string.h>
bool m[100001];
int main()
{
int mod,step,seed,num;
while(scanf("%d %d",&step,&mod)!=EOF)
{
memset(m,0,sizeof(m));seed=0;num = 0;
while(!(m[seed%mod])){
m[seed%mod]=1;seed=(seed+step)%mod;num++;
}
if(num==mod)
printf("%10d%10d Good Choice\n\n",step,mod);
else
printf("%10d%10d Bad Choice\n\n",step,mod);
}
}
15ms 104k
2.在网上看得资料:
简单证明:(不知正确与否,网上提交成功了)
令 f(x) = seed(x) + step ;
那么seed 的序列 就是 a=f(x) 的模MOD 加法群。
因为题中要求这个加法群的大小 | <a> | = MOD。
所以 a == 1 (mod MOD ).
即( seed(x) + STEP ) == 1 (mod MOD).
又因为seed(x) 必定含有0,
所以 STEP == 1 (mod MOD ).
即 STEP 和 MOD 互质
所以可以编写代码如下:
#include<stdio.h>
int gcd(int n,int m)
{
if(m==0)
return n;
return gcd(m,n%m);
}
int main()
{
int step,mod;
while(scanf("%d %d",&step,&mod)!=EOF)
{
if(gcd(step,mod)==1)
printf("%10d%10d Good Choice\n\n",step,mod);
else
printf("%10d%10d Bad Choice\n\n",step,mod);
}
}
0ms 4k