51Nod1079中国剩余定理

来源:互联网 发布:淘宝店铺联盟开通条件 编辑:程序博客网 时间:2024/06/05 13:37
数论总是烧脑的,但模板题总是能切的
学这个的时候先得弄懂欧几里得求gcd的算法,那个递归的挺好理解的(不过推荐改成非递归的,虽然这道题并不要用)
然后就学扩展欧几里得算法,想明白了就好,依然是求gcd,只是会记录一下过程(x,y),这篇博客很不错(推荐)  http://blog.csdn.net/zhjchengfeng5/article/details/7786595
然后再学中国剩余定理,前前后后花了几个小时,果然智商是硬伤
代码
#include<iostream>using namespace std;#define ll long longll m[13],p[13];int N;int e_gcd(ll a,ll b,ll &x,ll &y){    if(!b)    {        x=1;y=0;        return a;    }    int ans=e_gcd(b,a%b,x,y);    int temp=x;    x=y;    y=temp-(a/b)*y;    return ans;}ll f(){    ll M=1,y,x=0;    for(int i=0;i<N;i++)  M*=p[i];    for(int i=0;i<N;i++)    {        ll w=M/p[i];        ll tx=0;        int t=e_gcd(p[i],w,tx,y);        x=(x+y*w*(m[i]/t))%M;    }    return (x+M)%M;}int main(){    while(cin>>N)    {        for(int i=0;i<N;i++)            cin>>p[i]>>m[i];        cout<<f()<<endl;    }    return 0;}

原创粉丝点击