NYOJ 453 【小珂的烦恼 】

描述
假设有2k个人围着一个圆桌坐着,前k个是好人,后k个是坏人 。现在开始,每m个人踢掉一个,比如有6个人,m=5,那么,被踢掉的人依次是5,4,6,2,3,1。现在要求,在踢掉第一个好人前,必需把所有的坏人踢掉,问,给定一个k,求满足这个要求的最小的m,现在希望你写一个程序,快速的帮助小珂,计算出来这个m。

输入
每行一个整数k(k<15),0表示输入结束.总测试数据的组数不多于200.
输出
各个组对应的最小的m,换行结束。
样例输入
3
4
0
样例输出
5
30




#include<stdio.h>
#include<string.h>
int k,m;
int a[220];
int find(int k,int m)
{
	int n,a=1;
	for(n=1;n<=k;n++)
	{
		a=(a+m-1)%(2*k-n+1);
		if(!a)
			a=2*k-n+1;
		if(a<=k&&a>=1)
			return 0;
	}
	return 1;
}
int main()
{
	int n;
	while(scanf("%d",&k)!=EOF,k)
	{
		int r,h,w=0;
		if(!a[k])
		{
			for(r=0;;r++)
			{
				for(h=k+1;h<=2*k;h++)
				{
					m=2*k*r+h;
					if(find(k,m))
					{
						w=1;
						break;
					}
				}
				if(w==1)
					break;
			}
		}
		else
			w=1;
		if(w)
		{
			if(!a[k])
				a[k]=m;
			printf("%d\n",a[k]);
		}
	}
}	




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值