传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石,拥有A的能量;第二种魔法石叫做地冈石,拥有B的能量;而第三种,则是最神奇的天玄石,拥有无可比拟的C的能量!
但是有一天,沈宝宝太调皮了,把一颗天玄石玩丢了……
“这可玩大发了,这样我会被天行廖责备的。”沈宝宝悲伤的说到,“怎么办呢?”
这时候沈宝宝望了望窗外的飞过的白鸽,突然急中生智,想到了一个办法:干脆就用人铁石和地冈石把天玄石凑出来吧!
“只要我拿若干个人铁石,若干个地冈石,他们的能量之和,恰好加起来等于天玄石所拥有的能量。然后再把这些石头粘在一起,那么由若干个石头的组成的整体,我不就可以看做是一个天玄石了吗?“
沈宝宝愈发觉得自己机智。
所以现在有一个问题摆在你的面前了,给你A,B,C,请判断是否存在两个大于等于0的整数x,y满足Ax+By=C.
第一行一个T,表示有T组测试数据。
接下来T行,每行三个整数a,b,c,分别表示三块石头的能量值。
满足(1<=T<=100,1 ≤ a, b ≤ 100, 1 ≤ c ≤ 10 000)
对每一组测试答案均需要输出结果,如果可行的话,输出Yes,否则输出No
复制
2 1 2 3 4 6 15
Yes No
#include <bits/stdc++.h> //#include <ext/pb_ds/tree_policy.hpp> //#include <ext/pb_ds/assoc_container.hpp> //using namespace __gnu_pbds; using namespace std; #define LL long long #define INF 1E4 * 1E9 #define pi acos(-1) #define endl '\n' #define me(x) memset(x,0,sizeof(x)); const int maxn=1e3+5; const int maxx=1e3+5; const double EPS=1e-2; //typedef tree<pt,null_type,less< pt >,rb_tree_tag,tree_order_statistics_node_update> rbtree; void exgcd(int a,int b,int& g,int& x,int& y) { //int& a 是定义一个存放整形变量a的地址 if(!b){ g = a ; x = 1 ; y = 0;} // g用来存储gcd(a,b)的值 else { exgcd(b , a%b , g , y , x) ; y -= x * (a/b) ; } } void work(int a , int b , int d ,int& g , int& x , int& y) { exgcd(a,b,g,x,y); //此处的x,y接收 ax+by=gcd(a,b)的值 x *= d/g; //求ax+by=c 的解x // y *= d/g; //求ax+by=c 的解y int t = b/g; x = (x%t + t) % t; //求出最小非负整数 y = abs( (a*x - d) / b); //求相对应的y,取绝对值是为了当左边砝码数 x 为零的时候,得出来的 y 是正整数。 /* //以下是先求y再求对应的x 。 int t = a/g; y = (y%t + t) % t; x = abs( (d + b*y) / a); */ } int main(){ int a,b,d,g,x1,x2,y1,y2; int T; cin>>T; while(T--) { cin>>a>>b>>d; if(a==0&&b==0&&d==0)break; work(a,b,d,g,x1,y1); //work(b,a,d,g,x2,y2); //if( x1+y1 < x2+y2 ) // cout<<x1<<" "<<y1<<endl; // else if(x1*a+y1*b==d) cout<<"Yes"<<endl; else puts("No"); // cout<<y2<<" "<<x2<<endl; //(注意顺序) } return 0; }