zoukankan      html  css  js  c++  java
  • 【POJ2891】Strange Way to Express Integers

    【题目大意】

    给出k个模方程组:x mod ai = ri。求x的最小正值。如果不存在这样的x,那么输出-1.

    【题解】

    模板题,练习剩余定理的模板

     1 /*************
     2   POJ 2891
     3   by chty
     4   2016.11.3
     5 *************/
     6 #include<iostream>
     7 #include<cstdlib>
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<ctime>
    11 #include<cmath>
    12 #include<algorithm>
    13 using namespace std;
    14 #define MAXN 100000
    15 typedef long long ll;
    16 ll n,a[MAXN],m[MAXN];
    17 inline ll read()
    18 {
    19     ll x=0,f=1;  char ch=getchar();
    20     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
    21     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
    22     return x*f;
    23 }
    24 ll exgcd(ll a,ll b,ll &x,ll &y)
    25 {
    26     if(!b)  {x=1; y=0; return a;}
    27     ll r=exgcd(b,a%b,x,y);
    28     ll t=x;x=y;y=t-a/b*y;
    29     return r;
    30 }
    31 ll China()
    32 {
    33     ll A=a[1],M=m[1],k,y;
    34     for(ll i=2;i<=n;i++)
    35     {
    36         ll g=exgcd(M,m[i],k,y),da=a[i]-A;
    37         if(da%g)  return -1;
    38         ll t=m[i]/g;
    39         k*=da/g;
    40         k=(k%t+t)%t;
    41         A+=k*M;
    42         M=M*m[i]/g;
    43         A=(A+M)%M;
    44     }
    45     return A;
    46 }
    47 int main()
    48 {
    49     freopen("cin.in","r",stdin);
    50     freopen("cout.out","w",stdout);
    51     while(~scanf("%lld",&n))
    52     {
    53         for(ll i=1;i<=n;i++)  m[i]=read(),a[i]=read();
    54         printf("%lld
    ",China());
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    noip2008提高组题解
    noip2007提高组题解
    noip2006提高组题解
    一些题目(3)
    一些题目(2)
    洗牌问题
    一些题目
    同余模算术中的乘法逆元
    省常中模拟 Test2 Day2
    用矩阵乘法优化递推
  • 原文地址:https://www.cnblogs.com/chty/p/6026119.html
Copyright © 2011-2022 走看看