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

来源:互联网 发布:三娃被软件缠住过程 编辑:程序博客网 时间:2024/06/07 17:13

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 LOCALfreopen("Data.txt","r",stdin);freopen("Out.txt","w",stdout);#endifwhile(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");elseprintf("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");elseprintf("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
原创粉丝点击