【poj2891】Strange Way to Express Integers

题意:

给出n个模方程x=a(mod r) 求x的最小解

题解:

这就是个线性模方程组的模版题- - 但是有一些要注意的地方

extgcd算出来的解x可能负数  要让x=(x%mo+mo)%mo

而且mo不是等于lcm(r1,r2) 而是r2/gcd(r1,r2)

代码:

 1 #include <cstdio>

 2 typedef long long ll;

 3 ll n,a,r;

 4 ll extgcd(ll &x,ll &y,ll a,ll b){

 5     if (!b){

 6         x=1,y=0;

 7         return a;

 8     }else{

 9         ll res=extgcd(x,y,b,a%b);

10         ll t=x;

11         x=y;

12         y=t-a/b*y;

13         return res;

14     }

15 }

16 int main(){

17     while (scanf("%I64d",&n)!=EOF){

18         scanf("%I64d%I64d",&r,&a);

19         ll x,y,a1,r1;

20         bool bo=1;

21         for (ll i=2;i<=n;i++){

22             scanf("%I64d%I64d",&r1,&a1);

23             ll gc=extgcd(x,y,r,r1);

24             if ((a1-a)%gc) bo=0;

25             ll mo=r1/gc;

26             x=(x*(a1-a)/gc%mo+mo)%mo;

27             a+=r*x;

28             r*=r1/gc;

29         }

30         if (!bo) puts("-1");

31         else printf("%I64d\n",a);

32     }

33 }
View Code

 

你可能感兴趣的:(Integer)