1202 fudq's New Job(这个题挺有意思的)

fudq's New Job

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:45            测试通过:16

描述

自古云:“钱不是万能的,但是没有钱是万万不能的。”
fudq幻想着每天能够睡觉睡到自然醒,然后数钱数到手抽筋。于是他到银行找了一份数钱的工作,可惜数的是别人的钱……
fudq的工作很简单:客户提出需要m人民币,但是币种只能在闭区间[a,b]内,每种币种的数量没有限制,可以取很多,也可以不取。fudq只需要按照客户需求把钱数好准备好即可。
例如m=12,a=3,b=5,则fudq可以准备1枚3元,1枚4元,1枚5元的钱币,也可以准备3枚4元的钱币,但是不可以准备1枚4元,1枚8元的钱币,因为8元不在给出的区间内。
现在fudq想让你帮帮忙,问给出m,a,b,判断fudq是否能够按要求准备好钱币。

输入

输入有多组数据,每组的第一行是一个正整数T(1<=T<=100).
接下来有T行,代表T组测试数据,每组数据输入三个正整数m,a,b(1<=m,a,b<=10^9, a<=b).

输出

对应每组输入,请判断fudq能否按按要求准备好钱币,如果可以输出“Yes”,否则输出“No”。

样例输入

2
5 2 3
6 4 5
1
7 5 6

样例输出

Yes
No
No

代码:

//#define LOCAL
#include<stdio.h>
int main()
{
	int t;
#ifdef LOCAL
	freopen("Data.txt","r",stdin);
	freopen("Out.txt","w",stdout);
#endif
	while(scanf("%d",&t)!=EOF){
		while(t--){
			long long int m,a,b;
			scanf("%I64d%I64d%I64d",&m,&a,&b);
			if(a==b){
				if(m%a==0)
					printf("Yes\n");
				else
					printf("No\n");
			}
			else{
				if(m<a)
					printf("No\n");
				else if(m<=b)
					printf("Yes\n");
				else{
					if(m%a==0)
						printf("Yes\n");
					else{
						long long int x=m%a;
						long long int y=m/a;
						long long int z=b-a;
						if(z*y>=x)
							printf("Yes\n");
						else
							printf("No\n");
					}
				}
			}
		}
	}
	return 0;
}

总结:这题是贾梓健告诉我做的。。一开始老想着m=x1*a+x2*(a+1)+x3*(a+2)+...+xn+1*(a+n)这个方程是否成立。。。可能这样也可以判断。。无奈我数论水平不高,没法往下做,下面讲贾梓健告诉我的方法。

就拿m=41,a=6,b=8来讲。m/a=6......5,也就是说m==6+6+6+6+6+6+5==6+6+6+6+6+7+4==6+6+6+6+7+7+3==6+6+6+6+8+7+2==6+6+6+7+8+7+1==6+6+6+7+8+8.其实就是在不超过b的情况下把余数加到a上来。那么判断条件就出来了,

int x=m%a;   //余数
int y=m/a;      //最多可以有几个数相加。
int z=b-a;
if(z*y>=x)
  printf("Yes\n");
else
  printf("No\n");
这就是最后的判断条件,等价于把余数细分加入到a上面从而想办法凑出一个m。

如果即使是y(最多)个(b-a)相加也不会大于余数x,就等价于y*8<m,就不行  输出No。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值