51 nod 中国剩余定理

来源:互联网 发布:linux删除用户组命令 编辑:程序博客网 时间:2024/06/06 00:15

题目:点击打开链接

前提是除数数组m[i]是两两互质的。

x=a [ i ](mod m[ i ])     wi=M/mi,wi*Pi=1(mod mi)

ans=a1w1P1+a2w2P2+……ajwjPj

#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn=105;void gcd(ll a,ll b,ll &d,ll &x,ll &y){    if(!b){d=a;x=1;y=0;}    else{ gcd(b,a%b,d,y,x);y-=x*(a/b);}}ll a[maxn],m[maxn];ll china(int n, ll* a, ll* m){    ll M = 1, d, y, x = 0;    for(int i = 0; i<n; i++)        M *= m[i];    for(int i = 0; i<n; i++){        ll w = M / m[i];        gcd(m[i], w, d, d, y);        x = (x + y*w*a[i]) % M;    }    return (x+M)%M;}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%lld%lld",&m[i],&a[i]);    printf("%lld\n",china(n,a,m));    return 0;}

原创粉丝点击