Uva--408 (数学)

2014-06-12 13:13:03

题意&思路:gcd,判step,mod最大公约数是否为1,若是则good,否则bad。

证明(自己yy的):给出step,mod,令a=lcd(step,mod),把mod拓展开,列出这么几项:(列1)0,mod,2mod,3mod.....,a,再列出(列2)0,step,2step,3step......a,由题目可以知道的是,在迭代过程中如果再次出现0(即整除的情况),则可以得到0之前的为一个周期。如果我们把取余这个过程抽离出来,单纯的考虑列1和列2,就会发现列2直到列出a时(最小公倍数),才会使取余结果为0,而0-a之间的数%mod都是周期的一部分,所以周期中元素个数即为n=a/step。要使这个n==mod(即good choice的条件)则:mod==a/step,即:lcd(step,mod)==mod×step,说明了gcd(step,mod)==1,得证。

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;

int Gcd(int a,int b){
    return b == 0 ? a : Gcd(b,a % b);
}

int main(){
    int s,m;  
    while(scanf("%d %d",&s,&m) == 2){
        printf("%10d%10d    ",s,m);
        if(Gcd(s,m) == 1)
            printf("Good Choice\n\n");
        else
            printf("Bad Choice\n\n");
    }
    return 0;
}

 

posted @ 2014-06-12 13:14  Naturain  阅读(173)  评论(0编辑  收藏  举报