HDU 1014 Uniform Generator 欧几里得
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014
解题思路:
1. 把题目意思读懂后,明白会输入两个数,然后根据题中的公式产生一系列伪随机数,看这些数是不是能够包含0~MOD-1。如果产生不了就输出“Good Choice”,否则输出“Bad Choice”。
2. 全部假使x从0开始,设STEP为a,MOD为b。如果说a,b存在倍数关系,即假设最小存在2倍关系,那么就会有b=2a。x初始为0,第一步之后为a,第二步之后为0,之后a、0交替出现。周期为2,那么始终都不会产生0~b-1的全部数。以此类推,只要存在几倍关系,周期就为几。可见,两数存在倍数关系就不会得到全部数列。则2a与3a也不会有结果。所以说,当两数存在公约数,即两数不互质,就不会产生一系列数。
3. 如果两数互质,举一个最简单的例子。令a=b+1。则x初始为0,第一步之后为1,第二步之后为2,第三步之后为3,则可以产生一系列伪随机数满足题中要求。
4. 编写代码时注意最后输出,C++输出默认右对齐。
源代码:
1 #include<stdio.h> 2 int main() 3 { 4 int t,n,m,a,b; 5 while(scanf("%d%d",&m,&n)!=EOF) 6 { 7 a=m; 8 b=n; 9 if(m<n) 10 { 11 t=m; 12 m=n; 13 n=t; 14 } 15 if(n==0) 16 { 17 n=m; 18 } 19 else 20 { 21 while(m%n!=0) 22 { 23 t=m%n; 24 m=n; 25 n=t; 26 } 27 } 28 if(t==1) 29 printf("%10d%10d Good Choice\n\n",a,b); 30 else 31 printf("%10d%10d Bad Choice\n\n",a,b); 32 33 } 34 return 0; 35 }