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 y=m/a; //最多可以有几个数相加。
int z=b-a;
if(z*y>=x)
printf("Yes\n");
else
printf("No\n");
如果即使是y(最多)个(b-a)相加也不会大于余数x,就等价于y*8<m,就不行 输出No。