题目:
兔子的烦恼(二)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=317
题目大意:
在一座山上有n个山洞(每一个洞从0~n-1分别编号)。这山上有一仅仅兔子躲在山洞里,有一仅仅狼,从编号为0的山洞開始入洞,每隔m-1个洞。再次入洞抓兔子,如今兔子想知道是否有能避免这场灾难的山洞?
比如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4。可避难的山洞为:1,3,5;
解题思路:
对于n与m的最大公约数的倍数,经过多次循环狼都能遍訪到
难点具体解释:
令t=GCD(n,m)
则: 0t, 1t, 2t, 3t ,........kt [kt<n] 都不是安全的洞,总共同拥有k+1个;
==>> k=(n-1)/t;
==>> 兔子可躲避的洞穴个数N = n-k-1 = (n-1)-(n-1)/t;
又: n一定能整除 t ,n-1一定不能被 t 整除 [当t 不等于 1时],
所以: (n-1)/t==n/t-1;
则: n-1-(n-1)/t == n - n/t;
关键点:
由n、m的最大公约数的值推断兔子是否能躲避这场灾难。
附加代码:
#include<stdio.h>
int GCD(int n,int m)
{
return m?
兔子的烦恼(二)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=317
题目大意:
在一座山上有n个山洞(每一个洞从0~n-1分别编号)。这山上有一仅仅兔子躲在山洞里,有一仅仅狼,从编号为0的山洞開始入洞,每隔m-1个洞。再次入洞抓兔子,如今兔子想知道是否有能避免这场灾难的山洞?
比如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4。可避难的山洞为:1,3,5;
解题思路:
对于n与m的最大公约数的倍数,经过多次循环狼都能遍訪到
难点具体解释:
令t=GCD(n,m)
则: 0t, 1t, 2t, 3t ,........kt [kt<n] 都不是安全的洞,总共同拥有k+1个;
==>> k=(n-1)/t;
==>> 兔子可躲避的洞穴个数N = n-k-1 = (n-1)-(n-1)/t;
又: n一定能整除 t ,n-1一定不能被 t 整除 [当t 不等于 1时],
所以: (n-1)/t==n/t-1;
则: n-1-(n-1)/t == n - n/t;
关键点:
由n、m的最大公约数的值推断兔子是否能躲避这场灾难。
附加代码:
#include<stdio.h>
int GCD(int n,int m)
{
return m?
GCD(m,n%m):n;
}
int main()
{
int n,m,i;
while(~scanf("%d%d",&m,&n))
{
if(GCD(n,m)==1)
{
printf("NO
");
}
else
{
int t=GCD(n,m);
printf("%d",n-n/t);
for(i=1;i<n;++i) //第0个洞一定会经过,所以i从1開始
if(i%t!=0)
printf(" %d",i);
printf("
");
}
}
return 0;
}
解题时间:
2014-09-20 17:36
解题体会:
将详细问题抽象为数学模型。进而运用数学思想解决实际问题在编程中起着很关键的数据。