首页 > 其他 > 详细

Codevs 3990 [中国剩余定理]

时间:2017-02-14 20:42:08      阅读:263      评论:0      收藏:0      [点我收藏+]

模板题

注意如何得到[a,b]区间范围内的解

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=15;
inline ll read(){
    char c=getchar();ll x=0,f=1;
    while(c<0||c>9){if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
    return x*f;
}
ll n,l,r;
ll m[N],a[N],M=1;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
    if(b==0) d=a,x=1,y=0;
    else exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}
ll Inv(ll a,ll p){
    ll d,x,y;
    exgcd(a,p,d,x,y);
    return d==1?(x+p)%p:-1;
}
ll CRT(int n,ll *a,ll *m){
    ll x=0;
    for(int i=1;i<=n;i++){
        ll w=M/m[i];
        x=(x+a[i]*w%M*Inv(w,m[i]))%M;
    }
    return x;
}
int main(){
    freopen("in","r",stdin);
    n=read();l=read();r=read();
    for(int i=1;i<=n;i++) m[i]=read(),M*=m[i],a[i]=read();
    ll x=CRT(n,a,m),sum=0,mn=0;
    //printf("M %lld %lld\n",x,M);

    if(x<l) x*=(l-x-1)/x+1 +1;//,printf("x %lld\n",x);
    if(x<=r) sum=(r-x)/M+1,mn=x;
    printf("%lld\n%lld",sum,mn);
}

 

Codevs 3990 [中国剩余定理]

原文:http://www.cnblogs.com/candy99/p/6398978.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!