【扩展欧几里得】无题

这里写图片描述

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<queue>
#include<algorithm>
#include<stack>
#define rez(i,x,y) for(int i=x;i>=y;i--)
#define res(i,x,y) for(int i=x;i<=y;i++)
#define INF 2100000000
#define ll long long
#define clr(x)  memset(x,0,sizeof(x))

using namespace std;
long long gcd( long long a, long long b ) { 
    return b == 0 ? a : gcd( b, a % b );
}

long long lcm( long long a, long long b ) {
    return a / gcd(a,b) * b;
}

//  gcd(a,b) = a * x + b * y
long long exgcd( long long a, long long b, long long &x, long long &y ) {
    if( b == 0 ) {
        x = 1;
        y = 0;
        return a;
    } else {
        long long x0, y0;
        long long cd = exgcd( b, a % b, x0, y0 );
        x = y0;
        y = x0 - (a/b) * y0;
        return cd;
    }
}
long long exe( long long d,long long p) {
    int x1,x2,x3,y1,y2,y3,t1,t2,t3,k;
    if(d>p)d=d+p-(d=p);
    x1=1,x2=0,x3=p;
    y1=0,y2=1,y3=d;
    while(1){
        if(y3==0)return 0;
        if(y3==1)return y2;
        k=x3/y3;
        t1=x1-k*y1,t2=x2-k*y2,t3=x3-k*y3;
        x1=y1,x2=y2,x3=y3;
        y1=t1,y2=t2,y3=t3;
    }
}
long long T,n,b,p;
long long Abs(long long a){
    return a<0?-a:a;
}
int main(){//b*ans=a(mod p)
    freopen("calc.in","r",stdin);
    freopen("calc.out","w",stdout);
    cin>>T;
    while(T--){
        cin>>n>>b>>p;
        long long x=exe(b,p);
        x=(x%p)+p;
        cout<<n*x%p<<endl;
    }
    return 0;
}

水掉了,大家不要……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值