杭电1014解题报告

说实话,杭电的题有点变态~~~~~~~对格式要求这样严格 

本题表面是判断能不能取遍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
看透题就这样简单的   爱   当初做这道题我就没看透题。
 

你可能感兴趣的:(杭电1014解题报告)