链接
https://ac.nowcoder.com/acm/contest/9983/A
题意
已知 a , b a,b a,b, x ≡ a ( m o d p ) x \equiv a \pmod p x≡a(modp), y ≡ b ( m o d p ) y \equiv b \pmod p y≡b(modp),求 g c d ( x , y ) m o d p gcd(x,y) \bmod p gcd(x,y)modp 的最大值以及 x , y x,y x,y 的取值。
思路
当 a , b a,b a,b 不都为 0 0 0 时,最大值必为 p − 1 p-1 p−1。
{ ( p − 1 ) k 1 % p = a ( p − 1 ) k 2 % p = b \begin{cases} (p-1)k_1\%p=a \\ (p-1)k_2\%p=b \end{cases} {(p−1)k1%p=a(p−1)k2%p=b 可推出可行解: { k 1 = t 1 p − a k 2 = t 2 p − b ( t 1 , t 2 ≥ 1 ) \begin{cases} k_1=t_1p-a \\ k_2=t_2p-b \end{cases}(t1,t2 \ge 1) {k1=t1p−ak2=t2p−b(t1,t2≥1)
要保证 k 1 , k 2 k_1,k_2 k1,k2 互质,令 k 2 = p − b k_2=p-b k2=p−b, ( t 1 p − a ) % k 2 = 1 ⟹ t 1 p + m k 2 = 1 + a (t_1p-a)\%k_2=1 \Longrightarrow t_1p+mk_2=1+a (t1p−a)%k2=1⟹t1p+mk2=1+a。
因为 k 2 , p k_2,p k2,p 互质,所以此方程必有解。
代码
#include <bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long double LD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
//head
LL exgcd(LL a,LL b,LL &x,LL &y) {
if(!b) {x=1,y=0;return a;}
LL ret=exgcd(b,a%b,y,x);
y-=a/b*x;
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--) {
LL a,b,p;
cin>>a>>b>>p;
LL k1=p-a,k2=p-b,x,y;
if(!a&&!b) cout<<0<<' '<<0<<' '<<0<<'\n';
else {
exgcd(p,k2,x,y);
x=(x%k2+k2)%k2;
if(!x) x+=k2;
x*=1+a;
k1=x*p-a;
cout<<p-1<<' '<<k1*(p-1)<<' '<<k2*(p-1)<<'\n';
}
}
return 0;
}