前面写清楚了后面我就懒了QUQ
同余方程组:http://blog.youkuaiyun.com/qq_36038511/article/details/76890167
同余方程:http://blog.youkuaiyun.com/qq_36038511/article/details/76887494
以下是一些练习
hdu3579 Hello Kiki:http://acm.hdu.edu.cn/showproblem.php?pid=3579
#include <cstdio>
#include <cstring>
#include <cmath>
typedef long long LL;
using namespace std;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(a==0)
{
x=0;y=1;return b;
}
else
{
LL tx,ty;
LL d=exgcd(b%a,a,tx,ty);
x=ty-b/a*tx;
y=tx;
return d;
}
}
LL mymax(LL x,LL y) {return x>y?x:y;}
LL a[1100],b[1100];
int main()
{
LL t;
scanf("%lld",&t);
for(LL i=1;i<=t;i++)
{
bool pd=0;
LL m;scanf("%lld",&m);
for(LL j=1;j<=m;j++) scanf("%lld",&a[j]);
for(LL j=1;j<=m;j++) scanf("%lld",&b[j]);
LL c1,c2,m1,m2;
m1=a[1];c1=b[1];
for(LL j=2;j<=m;j++)
{
m2=a[j];c2=b[j];
LL x,y,A=m1,B=m2,K=c2-c1;
LL d=exgcd(A,B,x,y);
if(K%d!=0) pd=1;
else
{
x=((x*(K/d))%(B/d)+(B/d))%(B/d);
c1=c1+x*m1;
m1=m1*m2/d;
}
}
if(pd==1) printf("Case %lld: -1\n",i);
else if(c1==0) printf("Case %lld: %lld\n",i,m1);
else printf("Case %lld: %lld\n",i,c1);
}
return 0;
}
hdu 1579 X问题:http://acm.hdu.edu.cn/showproblem.php?pid=1573
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
LL mm[15],bb[15];
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if (a==0)
{
x=0;y=1;
return b;
}
else
{
LL tx,ty;
LL d=exgcd(b%a,a,tx,ty);
x=ty-(b/a)*tx;
y=tx;
return d;
}
}
int main()
{
LL x,y,d,A,B,K,m1,m2,b1,b2,N;
int u,n;
bool pk;
scanf("%d",&u);
while (u--)
{
scanf("%lld%d",&N,&n);
for (int i=1;i<=n;i++) scanf("%lld",&mm[i]);
for (int i=1;i<=n;i++) scanf("%lld",&bb[i]);
m1=mm[1];b1=bb[1];pk=false;
for (int i=2;i<=n;i++)
{
m2=mm[i];b2=bb[i];
A=m1;B=m2;K=b2-b1;
d=exgcd(A,B,x,y);
if (K%d!=0) pk=true;
else
{
x=((x*K/d)%(B/d)+(B/d))%(B/d);
b1=m1*x+b1;
m1=m1*m2/d;
}
}
if (pk==true||b1>N) printf("0\n");
else
{
LL ans=0;
if (b1<=N) ans=(N-b1)/m1+1;
if (ans&&b1==0) ans--;
printf("%lld\n",ans);
}
}
return 0;