题目大意
给出若干组除数和余数,求被除数
题目分析
很明显,就是中国剩余定理,结果我打出下面代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define sco 15
#define ll long long
using namespace std;
ll a[sco],m[sco],M[sco];
void exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,y,x);y-=a/b*x;
}
ll crt(ll a[],ll b[],ll n){
ll x,y,ans=0,num=1,m[sco];
for(int i=1;i<=n;++i)num*=a[i];
for(int i=1;i<=n;i++){
m[i]=num/a[i];
exgcd(m[i],a[i],x,y);
x=(x+a[i]%a[i]);
ans+=b[i]*m[i]*x;
}
return ans%num;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%lld%lld",&m[i],&a[i]);
printf("%lld",crt(m,a,n));
return 0;
}
挂了4个点……
于是!
我欲成仙奈何成魔!
魔解
#include<algorithm>
#include<iostream>
#include<cstdio>
#define ll long long
#define sco 100
using namespace std;
ll n,x,ans,a[sco],p[sco];
ll gc(ll a,ll b){
return (b==0?a:gc(b,a%b));
}
ll lm(ll a,ll b){
return a*b/gc(a,b);
}//求最小公倍数
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;++i) scanf("%lld%lld",&a[i],&p[i]);
ans=p[1];x=a[1];//赋值符合第一组除数余数的数
for(int i=2;i<=n;++i){
while(ans%a[i]!=p[i]) ans+=x;//暴力累加
x=lm(x,a[i]);
}
printf("%lld",ans);//输出
return 0;
}
被我用玄学过了。。