一道很基础的数论题,唉~~数学水平严重下降了....
证明1:如果n,m互质,则不存在逃生的山洞.
已知m为间隔 n为山洞个数
我们假设k为狼走的次数
则很容易知道 k*m%n 就是狼所走的洞
由于m和n互质,则狼想要回到0点,k的值最少为n
从第一步到在第一次回到0点之间,不会走重复的山洞
下面证明这一点,
假设中间存在相同的山洞
则 k1*m=a1*n+C
k2*m=a2*n+C
假设(n>=k1>k2,a1>=a2)
两式相减得(k1-k2)*m=(a1-a2)*n 这与k的值最少为n相矛盾
故不存在重复的山洞
因为狼走了k=n步,且不存在重复的山洞,很明显没有漏掉的山洞.
证明2:走过的山洞为n,m的最大公约数的倍数
由证明1 k*m%n就是狼所走的洞
下面就从 k*m%n入手 假设g为最大公约数 则m=g*t (t为一固定常数)
k*m%n=k*g*t%n 同余定理 得 k*m%n=(k*t%n)*g
故为n,m的最大公约数的倍数
#include<cstdio>
int gcd(int n,int m)
{
return m?gcd(m,n%m):n;
}
int main()
{
int m,n,g;
while(~scanf("%d%d",&m,&n))
{ g=gcd(m,n);
if(g==1) {printf("NO\n");continue;}
printf("%d",n-n/g);
for(int i=1;i<=n;i++)
if(i%g)printf(" %d",i);
putchar('\n');
}
}