题目传送门:https://www.luogu.org/problemnew/show/P3868
题意:
求一个最小的n,使得∀i,bi|(n-ai)。
思路:
考虑化简:bi|(n-ai)。
式子等价于 (n-ai) mod bi=0
发现就是一个线性同余方程组(因为题目满足b数组两两互质,用中国剩余定理也可以,但题解说要用快速乘,不然只有90分)的模板。
代码:
#include<cstdio>
#define LL long long
int n;
LL a[20],r[20];
LL x,y;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
LL tmp=exgcd(b,a%b,y,x);
y-=a/b*x;
return tmp;
}
int main()
{
LL a1,m1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&r[i]);
a1=a[1]%r[1],m1=r[1];
for(int i=2;i<=n;i++)
{
LL A=m1,B=r[i],C=(a[i]-a1)%r[i],k=exgcd(A,B,x,y),p=B/k;
x=(x%p*(C/k)%p+p)%p;
a1+=x*m1;
m1*=r[i]/k;
}
printf("%lld",a1);
}