码迷,mamicode.com
首页 > 其他好文 > 详细

【POJ2891】Strange Way to Express Integers

时间:2018-11-05 22:26:47      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:++   技术分享   name   公式   str   span   bit   scanf   color   

题意

有一个数x,x%ai = ri ,给出n对ai和ri,问x的最小非负整数是什么,如果不存在输出-1

分析

ai不互质的中国剩余定理--->扩展中国剩余定理

我已经放弃看懂证明了

直接上构造公式

技术分享图片

代码

#include<bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
ll n,x,y,ans,flag;
ll c[N],m[N];
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    ll ret=exgcd(b,a%b,x,y);
    ll t=x;x=y,y=t-(a/b)*y;
    return ret;
}
inline ll inv(ll a,ll b){ll tmp=exgcd(a,b,x,y);return x=(x%b+b)%b;} 
int main()
{
    while(scanf("%lld",&n)==1)
    {
        for(ll i=1;i<=n;i++)scanf("%lld%lld",&m[i],&c[i]);
        flag=1;
        for(ll i=2;i<=n;i++)
        {
            ll c1=c[i-1],m1=m[i-1],c2=c[i],m2=m[i],d=gcd(m1,m2);
            if((c2-c1)%d){flag=0;break;}
            m[i]=(m1*m2)/d;
            c[i]=(inv(m1/d,m2/d)*(c2-c1)/d)%(m2/d)*m1+c1;
            c[i]=(c[i]%m[i]+m[i])%m[i];
        }
        printf("%lld\n",flag?c[n]:-1);    
    }
    return 0;
}

 

 

【POJ2891】Strange Way to Express Integers

标签:++   技术分享   name   公式   str   span   bit   scanf   color   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9911636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!