1. 程式人生 > >【POJ2891】Strange Way to Express Integers

【POJ2891】Strange Way to Express Integers

題意

有一個數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; }