hdu1014Uniform Generator

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

原文地址:https://www.cnblogs.com/pandy/p/1319045.html