NYOJ 317 兔子的烦恼(二)

本文探讨了一种数学问题,通过计算最大公约数来确定兔子在特定条件下能否找到安全的山洞躲避狼的追捕。文章提供了完整的代码实现,并解释了算法背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

兔子的烦恼(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在兔子想知道是否有能避免这场灾难的山洞?

例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,可避难的山洞为:1,3,5;

输入
有多组测试数据,不超过11组;
每组有两个整数m,n(0<m,n<=10000000);
注意:程序以文件结束符“EOF”结束输入。
输出
兔子能避免这场灾难输出可避难山洞的总数和所有可避难山洞的编号(从小到大输出),否则输出NO;
样例输入
1 2
2 2
样例输出
NO
1 1


这又是一个数学问题,很简单,但是很难理解,你需要知道的是求出两个数的最大公约数temp,如果temp == 1的话 那么就意味着不论转几圈,所有的数总会被转到,

若temp !=1, 意味着转一圈,下标 i % temp 的数不会被进入,总个数怎么求呢,sum = n - n / temp,步长是temp嘛


# include <stdio.h>
# include <memory.h>

int a[10000005];

int gcd(int a, int b);

int main()
{
	int n, m;
	
	while ( scanf("%d %d", &m, &n) != EOF )
	{
		memset(a, 0, sizeof(a));
		int sum = 0, j = 0, i;
		int temp = gcd(m, n);
		if (temp == 1)
		{
			printf("NO\n");
		}
		else
		{
			sum = n - n/temp;
			printf("%d ", sum);
			for (i=0; i<n; i++)
			{
				if (i%temp != 0)
				{
					printf("%d ", i);
				}
			}
			printf("\n");
		}
	}
	
	return 0;
}

int gcd(int a, int b)
{
	if (0 == b)
		return a;
	else
		return gcd(b, a%b);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值