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; }