首页 > 代码库 > 解题报告

解题报告

题目:
兔子的烦恼(二)
题目链接: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\n");
}
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("\n");
}
}
return 0;
}
解题时间:
2014-09-20 17:36
解题体会:
将具体问题抽象为数学模型,进而运用数学思想解决实际问题在编程中起着非常重要的作用。

解题报告