zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    7-5 幸运彩票 (15分)
    基于Python实现学生管理系统
    NB-IoT模块烧写详细过程
    IAR软件使用的快捷键配置以及配置cc2530环境
    7-54 求方程的解 (10 分)
    7-52 计算球体积 (10 分)
    7-51 号码牌的制作 (10 分)
    7-48 输出星期名缩写 (70 分)
    7-49 求前n项的阶乘之和 (15 分)
    7-46 jmu-python-求单词长度 (10 分)
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9399506.html
Copyright © 2011-2022 走看看