P3868 [TJOI2009]猜数字
链接: link.
题目:
题解:
中国剩余定理+快速乘(避免超long long)
具体后补
#include<bits/stdc++.h>
using namespace std;
//int vis[200010];
int k;
long long a[20],b[20];
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
long long d=exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y;
return d;
}
long long ksc(long long a,long long b,long long mod)//快速乘
{
long long ans=0;
for(;b;b>>=1,a=(a+a)%mod)
{
if(b&1)ans=(ans+a)%mod;
}
return ans;
}
long long crt()
{
long long m=1,x,y,ans=0;
for(int i=1;i<=k;i++)m*=b[i];
for(int i=1;i<=k;i++)
{
long long M=m/b[i];
exgcd(b[i],M,x,y);
y=(y%b[i]+b[i])%b[i];
ans=(ans+ksc(y,ksc(M,(a[i]+m)%m,m),m)+m)%m;
}
if(ans<0)ans+=m;
return ans;
}
int main()
{
//long long n,m,k;
cin>>k;
for(int i=1;i<=k;i++)scanf("%lld",&a[i]);
for(int i=1;i<=k;i++)scanf("%lld",&b[i]);
cout<<crt()<<endl;
}