• hpu_newoj_1028-exgcd


     

    描述

     

    全是电梯。

    Philo正处于高度为0的一个平台上,在他面前的一个平面,全是上上下下的电梯。

    Philo想要离开这里,请你帮帮他。

    电梯世界规则:这里的电梯所能到达的层数皆为整数层,当Philo进入电梯,他只能选择上升a层或者下降b层(电梯只有这两种选择且a,b不同时为0)。对于任意整数层都有无限的电梯可乘坐(前提是Philo能够到达这一层)。

    Philo在第0层,现在请你帮助Philo到达第nn层。如果可以请输出"YES",并输出他的合法的最小解。否则输出"NO"。

     

    输入

     

    每组测试数据输入三个整数n,a,b;

    含义如题上所述

    输入到文件结束;

    -1e9<= n <=1e9

    0<= a, b <=1e9

     

    输出

     

    若能够通过一定的次数使Philo到达第nn层,则先输出YES,下一行输出合法的最小解,否则输出NO.

     

    输入样例 1 

    3 6 9
    4 9 3

    输出样例 1

    YES
    2 1
    NO

        这几天一直再写,,WA到死刚才终于过了,因为有好多特殊数据需要特判。。。
        还是经典的a*x+b*y=n 但是y必须是负数,x必须是正数,因为题目要求是下楼。所以当n是正数的时候答案就是让y取一个最大的
    负数解,当n是负数的时候交换一下a,b就好了做法一样,记得输出的时候也要交换一下。由于a,b可能出现0导致除0,所以特判下。
      
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 using namespace std;
     5 #define LL long long 
     6 #define mp make_pair
     7 #define pb push_back
     8 #define inf 0x3f3f3f3f
     9 void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
    10     if(!b){d=a;x=1;y=0;}
    11     else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}
    12 }
    13 int main(){
    14     LL n,a,b,x,y,d;
    15     while(scanf("%lld%lld%lld",&n,&a,&b)!=EOF){
    16         bool huan=0;
    17         if(n==0){
    18             puts("YES");
    19             puts("0 0");
    20             continue;
    21         }
    22         if(a==0){
    23             if(n>0){
    24                 puts("NO");
    25             }
    26             else{
    27                 if((-n)%b==0){
    28                     puts("YES");
    29                     cout<<0<<' '<<(-n)/b<<endl;
    30                 }
    31                 else puts("NO");
    32             }
    33             continue;
    34         } 
    35         else if(b==0){
    36             if(n>0){
    37                 if(n%a==0){
    38                     puts("YES");
    39                     cout<<n/a<<' '<<0<<endl;
    40                 }
    41                 else puts("NO");
    42             }
    43             else{
    44                 puts("NO");
    45             }
    46             continue;
    47         }
    48         if(n<0){
    49             n=-n;
    50             swap(a,b);
    51             huan=1;
    52         }
    53         exgcd(a,b,d,x,y);
    54         
    55         if(n%d){
    56             puts("NO");
    57         }
    58         else{
    59             x=x*n/d,y=y*n/d;
    60             LL d1=b/d,d2=a/d;
    61             y=(y%d2-d2)%d2;
    62             x=(n-y*b)/a;
    63             puts("YES");
    64             if(!huan)cout<<abs(x)<<' '<<abs(y)<<endl;
    65             else cout<<abs(y)<<' '<<abs(x)<<endl;
    66         }
    67     }
    68     
    69     return 0;
    70 }



  • 相关阅读:
    UnixTime的时间戳的转换
    dotnet cors 跨域问题
    sqlServer备份和还原语句
    mvc的生命周期
    Java序列化
    js 分页
    jquery js 分页
    Myeclipse 6.0代码
    前序遍历_中序遍历_后序遍历
    数组去重的一些方法以及数组排序
  • 原文地址:https://www.cnblogs.com/zzqc/p/9478931.html
Copyright © 2020-2023  润新知