传送门:http://poj.org/problem?id=1061
题意:汉语的还不认识??
题解:蒟蒻TMD学了一下午的扩展欧几里得啊啊啊啊,还是不会==,一点点理解:
求ax+by=gcd(a,b)
设 a'=b b'=a%b=a-a/b*b
求a'x'+b'y'=gcd(a',b')
==>bx'+(a-a/b*b)y'=gcd(a',b')
==>ay'+b(x'-a/b*y')=gcd(a',b')=gcd(a,b)=ax+by
==>ay'+b(x'-a/b*y')=ax+by
==>x=y' y=x'-a/b*y'
------------------------------------------蒟蒻猜想
对于不定整数方程pa+qb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解。
上面已经列出找一个
整数解的方法,在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,
/*p * a+q * b = Gcd(a, b)的其他整数解满足:
p = p0 + b/Gcd(a, b) * t
q = q0 - a/Gcd(a, b) * t(其中t为任意
整数)
至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(a, b)的每个解乘上 c/Gcd(a, b) 即可
在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,应该是
得到p * a+q * b = c的一组解p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b)),p * a+q * b = c
-------------------------------------------------------------抄自度娘
Code:
/*
ID:iamzky
OJ:POJ
Index:1061
Language:C++
*/
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long lld;
lld gcd(lld a,lld b){
if(!b)return a;
return gcd(b,a%b);
}
void exgcd(lld a,lld b,lld &x,lld &y){
if(b==0){
x=1;y=0;
}else{
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
}
int main(){
lld s,k,x,y,a,b,d,n,m,l;
while(cin>>x>>y>>m>>n>>l){
a=n-m;
b=l;
d=x-y;
k=gcd(a,b);
if(d%k){
cout<<"Impossible"<<endl;
continue;
}
a/=k;
b/=k;
d/=k;
exgcd(a,b,x,y);
x=(x*d+l)%l;
if(x<0)x+=b;
cout<<x<<endl;
}
return 0;
}
===================================================================================================================================
传送门:https://www.smartoj.com/p/1046
刷清帝之惑之康熙,一模一样的题,上面代码只有80分,迫不得已百度,写了新的扩欧
Code:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long lld;
lld exgcd(lld a,lld b,lld &x,lld &y){
if(!b){
x=1;
y=0;
return a;
}else{
lld g=exgcd(b,a%b,x,y);
lld t=x;
x=y;
y=t-a/b*y;
return g;
}
}
lld X,Y;
lld x,y,m,n,l;
int main(){
cin>>x>>y>>m>>n>>l;
lld a=(m-n+l)%l;
lld b=l;
lld c=(y-x+l)%l;
lld g=exgcd(a,b,X,Y);
if(c%g){
cout<<"Impossible"<<endl;
return 0;
}else{
lld k=c/g;
X*=k;
c=l/g;
while(X<0){
X+=c;
}
X%=c;
cout<<X<<endl;
}
return 0;
}