51nod 1079 中国剩余定理

来源:互联网 发布:pl sql insert into 编辑:程序博客网 时间:2024/06/05 22:39

51nod 1079 中国剩余定理

逐级满足法:
具体:http://blog.csdn.net/qq_33199236/article/details/51494157

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#include <map>using namespace std;#define LL long long#define INF 0x3f3f3f3f#define PI acos(-1.0)#define E 2.71828//#define MOD 1000000007#define N 1010int exgcd(int a,int b,int &x,int &y){    if(b == 0)    {        x = 1;        y = 0;        return a;    }    int d = exgcd(b,a%b,x,y);    int t = x;    x = y;    y = t - a/b*y;    return d;}int ni[20],c[20];int main(){    int t;    scanf("%d",&t);    for(int i =0;i < t; i++)        scanf("%d%d",&ni[i],&c[i]);//ni[]为ni;//c[]为ai; 这里因为x≡ai (%ni)就为 x + ni*y = ai;作为不定方程ax + by = c来看,ai就为ci。    int now_mod = ni[0]; //n1第一个方程    int now_c = c[0];     //a1第一个方程    for(int i = 1; i < t; i++)    {//n1*x+n2*y==a2-a1,这里由于在用扩展欧几里德时,a,b会变化,   所以再引用了变量now_mod。下面只作方程一和二的讲解        int a = now_mod;  //n1        int b = ni[i];   //n2        int c_real = c[i] - now_c; //a2-a1        int x,y;        int d = exgcd(a,b,x,y);        x = x * c_real/d;        int r = b/d;        x = (x%r+r)%r;    //得到最小正的x。        now_c = now_mod * x + now_c; //变化的C        now_mod = now_mod * (ni[i]/d); //变化的n//得到第一和第二合并的式子就是 c(这个其实无所谓,重点在下面俩的变化) ≡ now_c (mod now_mod)    }    int ans = now_c;    printf("%d\n",ans);}
0 0
原创粉丝点击