喵哈哈村的魔法石

沈宝宝不小心丢失了一颗珍贵的天玄石,决定用其它两种魔法石的能量组合来代替。这个问题转化为数学上的整数解问题,即是否存在整数x,y使得Ax+By=C成立。本文通过扩展欧几里得算法解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石,拥有A的能量;第二种魔法石叫做地冈石,拥有B的能量;而第三种,则是最神奇的天玄石,拥有无可比拟的C的能量!

但是有一天,沈宝宝太调皮了,把一颗天玄石玩丢了……

“这可玩大发了,这样我会被天行廖责备的。”沈宝宝悲伤的说到,“怎么办呢?”

这时候沈宝宝望了望窗外的飞过的白鸽,突然急中生智,想到了一个办法:干脆就用人铁石和地冈石把天玄石凑出来吧!

“只要我拿若干个人铁石,若干个地冈石,他们的能量之和,恰好加起来等于天玄石所拥有的能量。然后再把这些石头粘在一起,那么由若干个石头的组成的整体,我不就可以看做是一个天玄石了吗?“

沈宝宝愈发觉得自己机智。

所以现在有一个问题摆在你的面前了,给你ABC,请判断是否存在两个大于等于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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值