说实话,杭电的题有点变态~~~~~~~对格式要求这样严格
本题表面是判断能不能取遍m的余数~~~~~~其实考的是互质~~~~
http://acm.hdu.edu.cn/showproblem.php?pid=1014
#include <stdio.h>
int main()
{
long int STEP,MOD;
while(scanf("%ld%ld",&STEP,&MOD)!=EOF)
{
int k=1,count=1,M,N;
long int seed[100000];
seed[0]=0;
seed[k]=(seed[k-1]+STEP)%MOD;
while(seed[k]!=seed[0])
{
k++; //K 应该在seed[k]=(seed[k-1]+STEP)%MOD前面自增
seed[k]=(seed[k-1]+STEP)%MOD;
count++;
}
if(count==MOD)
{
printf("%10ld%10ld Good Choice\n\n",STEP,MOD);//Good Choice前面有4个空格,5个空格不给过的。
}
else
{
printf("%10ld%10ld Bad Choice\n\n",STEP,MOD);//而且必须2个\n,否则也不给过。悲催死.
}
}
return 0;
}
以下是摘得大牛的代码,供参考~~~~~
#include <iostream>
#include <iomanip>
using namespace std;
inline int prand();
int seed, step, mod;
int main()
{
int head, tail, decreasor = 0;
while (cin >> step >> mod && mod) {
decreasor = 0;
seed = 0;
// 第一个随机数
head = prand();
// 在 0 到 mod-1 的范围内,所以整数的总和
for (int i = 0; i < mod; i++)
decreasor += i;
// 减去第一个随机数
decreasor = decreasor - head;
// 如果是good choice,decreasor 将在第二个重复周期前减至 0
while (head != (tail = prand())) {
decreasor -= tail;
}
cout << setw(10) << step
<< setw(10) << mod
<< " ";
if (decreasor)
cout << "Bad Choice";
else
cout << "Good Choice";
cout << endl << endl;
}
return 0;
}
// 随机数产生器
inline int prand()
{
seed = (seed + step) % mod;
return seed;
}
本题其实考察的是两个数的互质,如果两个数互质输出good choice 否则输出bad choice
看透题就这样简单的 爱 当初做这道题我就没看透题。