标签:blog os io for 2014 amp log ios
扩展欧几里得
#include<stdio.h>
int exgcd(int a, int b, int &x, int &y)
{
int d,tmp;
if (b==0)
{
x = 1;
y = 0;
return a;
}
d = exgcd(b,a%b,x,y);
tmp = x;
x = y;
y = tmp - a/b * y;
return d;
}
int main()
{
int a,b,x,y,k;
scanf("%d %d",&a,&b);
k=exgcd(a,b,x,y);
printf("%d %d %d\n",k,x,y);
return 0;
}中国剩余定理
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int gcd(int a,int b,int &x,int &y)
{
int d,temp;
if(b==0) // 不定方程 a*x+b*y=gcd(a,b)=d;(x,y)为其一组整数解
{
x=1;
y=0;
return a;
}
d = gcd(b,a%b,x,y);
temp = x;
x = y;
y = temp - a/b * y;
return d;
}
int main()
{
int m,m1,r1,m2,r2,flag=0;
int a[11],b[11],T;
cin>>T;
while(T--)
{
int i,j;
int x,y,d,c,t;
cin>>m;
for(i=0;i<m;i++)
cin>>a[i];
for(i=0;i<m;i++)
cin>>b[i];
// x%m1=r1,x%m2=r2 ...
// x=m1*k1+r1,x=m2*k2+r2 ... (k1,k2 ... 为任意整数)
// m1*k1-m2*k2=r2-r1 ...
flag=0;
m1=a[0];r1=b[0];
for(i=1;i<m;i++)
{
m2=a[i];r2=b[i];
if(flag)
continue;
d=gcd(m1,m2,x,y); // 方程 x*m1+y*m2=d=gcd(m1,m2);
c=r2-r1;
if(c%d) //对于方程m1*x+m2*y=c=r2-r1,如果c不是d的倍数就无整数解
{
flag=1;
continue;
}
//对于方程m1*x+m2*y=c=r2-r1,若(x0,y0)是一组整数解,那么(x0+k*(m2/d),y0-k*(m1/d))也是一组整数解(k为任意整数)
//其中x0=x*(c/d),y0=y*(c/d); (x,y为方程m1*x+m2*y=d=gcd(a,b)的一组整数解)
t=m2/d;
x=(c/d*x+t)%t; //保证x0是正数,因为x+k*t是解,(x%t+t)%t也必定是正数解(必定存在某个k使得(x%t+t)%t=x+k*t)
r1=m1*x+r1;
m1=m1*m2/d;
}
if(flag)
cout<<0<<endl;
else
cout<<r1<<endl;
}
return 0;
} 标签:blog os io for 2014 amp log ios
原文地址:http://blog.csdn.net/fyxz1314/article/details/38509853