码迷,mamicode.com
首页 > 其他好文 > 详细

hpu_newoj_1028-exgcd

时间:2018-08-15 00:36:44      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:答案   选择   main   space   target   turn   base   container   就是   

 

描述

 

全是电梯。

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 }

 




hpu_newoj_1028-exgcd

标签:答案   选择   main   space   target   turn   base   container   就是   

原文地址:https://www.cnblogs.com/zzqc/p/9478931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!