2018/7/31 -zznu-oj -问题 C: 磨刀- 扩展欧几里得算法的基本应用

Posted zhazhaacmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018/7/31 -zznu-oj -问题 C: 磨刀- 扩展欧几里得算法的基本应用相关的知识,希望对你有一定的参考价值。

问题 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
");
31         else
32             printf("NO
");
33     }
34 
35     return 0;
36 }
View Code

 








以上是关于2018/7/31 -zznu-oj -问题 C: 磨刀- 扩展欧几里得算法的基本应用的主要内容,如果未能解决你的问题,请参考以下文章

2018.7.31 Noip2018模拟测试赛(十六)

购物车代码

es6 webpack转es5

SQL CTE性能是否取决于声明顺序?

C/C++ ceil 函数

C/C++ floor 函数