Uniform Generation
题目:
公式:seed(x+1) = [seed(x) + STEP] % MOD;如果STEP=3,MOD=5,那么seed的值为以3,1,4,2,0为一组循环,即[0,MOD-1],这种称为“Good Choice”;如果STEP=15,MOD=20,那么seed的值为以15,10,5,0为一组循环,不满足[0,MOD-1],所以这种称为“Bad Choice”。
input:3 5
output: 3 5 Good Choice
15 20 Bad Choice
63923 99999 Good Choice (注意格式,这里无)
代码1:
#include<iostream>
#include<memory.h>
#include<cstdio>
using namespace std;
int main(){
int step,mod,seed;
bool pd[1000];
while(cin>>step>>mod){
printf("%10d%10d ",step,mod);
memset(pd,0,1000); //把pd中前1000个数用0代替,并返回到pd
seed=(0+step)%mod;
pd[seed]=1;
while(seed!=0){
seed=(seed+step)%mod;
pd[seed]=1;
}
bool flag=1;
for(int i=0;i<mod;i++){
if(pd[i]==0){
flag=0;
break;
}
}
if(flag) cout<<"Good Choice"<<endl;
else cout<<"Bad Choice"<<endl;
cout<<endl;
}
return 0;
}
这题也是用来判断两个数得最大公约数是不是1,即这两个数是互质的。
#include<iostream>
#include<stdio.h>
using namespace std;
int zs(int step,int mod){ //求最大公约数
if(mod==0)
return step;
else
zs(mod,step%mod);
}
int main(){
int step,mod;
while(cin>>step>>mod){
if(zs(step,mod)==1){
printf("%10d%10d Good Choice\n",step,mod);
}
else{
printf("%10d%10d Bad Choice\n",step,mod);
}
cout<<endl;
}
return 0;
}