描述
全是电梯。
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 }