HDU 1573 X问题 (中国剩余定理) -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    【题目大意】:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10),

HDU 1573 X问题 (中国剩余定理)

    【思路】中国剩余定理的应用,注意是求满足一定条件的个数

    代码:

/** Problem: HDU No.1573* Running time: 0MS* Complier: G++* Author: javaherongwei* Create Time:  10:39 2015/9/19 星期六* 中国剩余定理的特殊情况:ai不一定相互互质*/#include<stdio.h>#include<string.h>#include<iostream>#include using namespace std;typedef long long LL;const int N=15;LL a[N],b[N];LL n,m,ans,m1,r1,m2,r2,c,x,t;bool ok;int tt;void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y){/// a*x+b*y=gcd(a,b)=d;(x,y) 为其一组整数解    if(!b){        d=a,x=1,y=0;    }    else{        ex_gcd(b,a%b,d,y,x);        y-=x*(a/b);    }}LL ex_crt(LL *a,LL *b,LL n){    LL x,y,d;    m1=a[0],r1=b[0];    for(int i=1; i<m; ans="(n-r1)/m1+1;///m1为ai的最小公倍数,凡是m1*i+r1的都是符合要求的数,其中r1最小" c="r2-r1;" i="0;" int="" lld="" m="m1*x%m+M(i-1)%m=M(i-1)%m=r" m1="m1*m2/d;" m2="a[i];" m2y="c=r2-r1,若(x0,y0)是一组整数解,那么(x0+k*m2/d,y0-k*m1/d)也是一组整数解(k为任意整数)" mi="m1*x+M(i-1)=r2-m2*y(m1为前i个m的最小公倍数);对m2取余时,余数为r2;" k="1;" pre="" r1="=0)" r2="b[i];" return="" t="m2/d;" x="(c/d*x%t+t)%t;///保证x0是正数,因为x+k*t是解,(x%t+t)%t也必定是正数解(必定存在某个k使得(x%t+t)%t=x+k*t)" x0="x*c/d,y0=x*c/d;" y="c,如果c不是d的倍数就无整数解"></p></m;></iostream></string.h></stdio.h>

最新文章