欧几里德 扩展欧几里德 博客视频参考:
http://www.cnblogs.com/void/archive/2011/04/18/2020357.html
https://www.nowcoder.com/live/153/4/1
poj 1061 青蛙约会
点击就送一刀99
#include
using namespace std;
#define LL long long
LL exgcd(LL a,LL b,LL &x,LL &y){
if(b==0){
x=1;
y=0;
return a;
}
LL r=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return r;
}
LL xxx(LL a,LL b,LL c){
LL x,y;
LL gcd=exgcd(a,b,x,y);
if(c%gcd!=0) return -1;
x*=c/gcd;
b/=gcd;
if(b<0) b=-b;
LL ans=x%b;
if(ans<=0){
ans+=b;
}
return ans;
}
int main(){
int x,y,m,n,l;
cin>>x>>y>>m>>n>>l;
if(xxx(m-n,l,y-x)==-1) cout<<"Impossible"<
hdu 1756
点击 点击打开链接
/*
设A=9973*y+n,因为A%B=0,所以(9973*y+n)=B*x,其中x=A/B
移项,有B*x+9973*(-y)=n。
联想到扩展GCD的式子:B*X+9973*Y=1,两边都乘以n,B*(nX)+9973*(nY)=n。
这样x=nX,y=-nY,只要求出X和Y就行了,套扩展GCD模板即可
*/
#include
using namespace std;
#define LL long long
LL exgcd(LL a,LL b,LL &x,LL &y){
if(b==0){
x=1;
y=0;
return a;
}
LL r=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return r;
}
LL xxx(LL a,LL b,LL c){
LL x,y;
LL gcd=exgcd(a,b,x,y);
if(c%gcd!=0) return -1;
x*=c/gcd;
b/=gcd;
if(b<0) b=-b;
LL ans=x%b;
if(ans<=0){
ans+=b;
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--){
LL n,b;
cin>>n>>b;
LL ans=xxx(b,9973,n);
cout<
hdu 2669
点击打开链接
#include
using namespace std;
#define LL long long
LL exgcd(LL a,LL b,LL &x,LL &y){
if(b==0){
x=1;
y=0;
return a;
}
LL r=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return r;
}
LL xxx(LL a,LL b,LL c){
LL x,y;
LL gcd=exgcd(a,b,x,y);
if(c%gcd!=0) return -1;
x*=c/gcd;
b/=gcd;
if(b<0) b=-b;
LL ans=x%b;
if(ans<=0){
ans+=b;
}
return ans;
}
int main(){
LL a,b;
while(cin>>a>>b){
LL ans=xxx(a,b,1);
if(ans==-1) cout<<"sorry"<
zoj 3609
点击打开链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x7fffffff
#define EPS 1e-12
#define MOD 1000000007
#define PI 3.141592653579798
#define N 100000
using namespace std;
typedef long long LL;
typedef double DB;
LL e_gcd(LL a,LL b,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
LL ans=e_gcd(b,a%b,x,y);
LL temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
LL cal(LL a,LL b,LL c)
{
LL x,y;
LL gcd=e_gcd(a,b,x,y);
if(c%gcd!=0) return -1;
x*=c/gcd;
b*=c/gcd;
if(b<0) b=-b;
LL ans=x%b;
if(ans<=0) ans=ans+b;
return ans;
}
int main()
{
LL a,b,t;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&a,&b);
LL ans=cal(a,b,1);
if(ans==-1) printf("Not Exist\n");
else printf("%lld\n",ans);
}
return 0;
}
牛客
点击打开链接
#include
using namespace std;
#define maxn 100000+100
#define LL long long
LL l[maxn];
LL r[maxn];
LL exgcd(LL a,LL b,LL &x,LL &y){
if(b==0){
x=1;
y=0;
return a;
}
LL ans=exgcd(b,a%b,x,y);
LL t=x;
x=y;
y=t-a/b*y;
return ans;
}
LL xxx(int n){
LL aa=l[0],bb=r[0];
for(int j=1;j>n;
for(int j=0;j