兔子的烦恼(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m个洞,再次入洞抓兔子,现在兔子想知道是否有能避免这场灾难的山洞?
例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,可避难的山洞为:1,3,5;
- 输入
- 有多组测试数据,不超过11组;
每组有两个整数m,n(0<m,n<=10000000);
注意:程序以文件结束符“EOF”结束输入。 输出 - 兔子能避免这场灾难输出可避难山洞的总数和所有可避难山洞的编号(从小到大输出),否则输出NO; 样例输入
-
1 22 2
样例输出 -
NO1 1
#include<stdio.h> #include<string.h> int a[10000000]={0}; int main(){ int m,n,i,count; while(scanf("%d %d",&m,&n)!=EOF){ count=0; for(i=0;i<n;i=(i+m)%n){ if(a[i]) //a[i]=1,说明往后面开始循环,所以跳出。 break; else {// a[i]=0;把 a[i]=1; a[i]=!a[i]; count++; } } if(count) { printf("%d ",count); for(i=0;i<n;i++)// 如果a[i]=0;说明兔子可以存活。 {if(!a[i]){ printf("%d ",i); } } printf("\n"); } else printf("NO\n"); for(i=0;i<n;i++) if(a[i]) a[i]=!a[i]; } }
这个超时了。
继上次那个最大公约数,最优解:
#include<stdio.h> int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF){ int g; g=gcd(n,m); if(g==1) printf("NO\n"); else { printf("%d ",n-n/g); for(int i=1;i<n;i++){ if(i%g!=0) printf("%d ",i); } printf("\n"); } } }
- 有多组测试数据,不超过11组;