问题 C: 磨刀
时间限制: 1 Sec 内存限制: 128 MB
提交: 190 解决: 39
[提交] [状态] [讨论版] [命题人:admin]
题目描述
磨刀是一个讲究的工作,只能在n℃下进行,所以我们首先要做的就是把刀的表面温度提升到n℃。
处理刀身温度有两种方式:
1.淬火,使刀身温度提高a℃;
2.冰敷,使刀身温度降低b℃。
宝儿姐想知道,能否经过多次处理,使得刀身温度达到n℃。
输入
每组输入包含一行:包含三个非负整数n, a, b,含义如上文,数据范围均不超过2^63,输入已EOF结束
输出
根据计算,输出“YES”或“NO”。
样例输入
3 6 9
样例输出
YES
提示
对于第一个样例先冰敷使刀身温度降至-9℃,在淬火使刀身温度升至3℃即可 。
刀身起始温度为0 。
大致思路:
1、第一眼想到bfs,其实不行,数据返回太大,毕竟数据范围均不超过2^63!
2、用longlong来存储所有数据!
3、本题求的是一个方程式:a*x+b*y=n, x表示a磨刀的次数,y表示b磨刀的次数!当然了x和y在应用扩展欧几里得算法的时候会出现负值的情况,需要剔除掉这些情况|!
4、初始温度为0,看‘’提示‘’得到的信息!一点瑕疵!
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<string> 5 #include<algorithm> 6 #define ll long long 7 using namespace std; 8 #define N 100 9 10 ll exgcd(ll a,ll b,ll x,ll y){ 11 if(!b) 12 { 13 x=1;y=0;return a; 14 } 15 else{ 16 17 ll r=exgcd(b,a%b,y,x); 18 y-=a/b*x; 19 return r; 20 } 21 22 } 23 24 int main(){ 25 ll n,a,b; 26 while(scanf("%lld%lld%lld",&n,&a,&b)!=EOF){ 27 ll r, x,y; 28 r=exgcd(a,b,x,y); 29 if(n%r==0&&x>=0&&y>=0) 30 printf("YES\n"); 31 else 32 printf("NO\n"); 33 } 34 35 return 0; 36 }
原文地址:https://www.cnblogs.com/zhazhaacmer/p/9399506.html
时间: 2024-10-24 15:37:38