zoukankan      html  css  js  c++  java
  • 萌萌哒哒的2233娘~~~~

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia

    题目大意

    求解一组同余方程
    x ≡ r1 (mod a1)
    x ≡ r2 (mod a2)
    x ≡ r3 (mod a3)
    ......
    x ≡ rk (mod ak)
    的解x(a1,a2,a3,.....ak 并不一定互质)。如果不存在则输出-1.

    输入格式

    有多组数据,每组数组第一行为k,后面有k行,每行两个数,代表ai,ri。

    输出格式

    每一行对应每一个询问的解x。

    样例输入

    2
    8 7
    11 9

    样例输出

    31

    分析

    看到这一题,可以发现好像问的就是中国剩余定理的问题,可是题目中a并不互质,无法用中国剩余定理来解决。不过我们可以从扩展欧几里德算法入手。

    先来分析规模小一点的。

    对于一组同余方程

    (egin {cases} x mod a_1=r_1\ xmod a_2=r_2end{cases} oegin{cases}k_1*a_1+r_1=x\ k_2* a_2+r_2=xend {cases})

    我们可以上下两式相减得出

    $ k_1* a_1-k_2* a_2=r_2-r_1$

    我们可以发现,这个式子可以用扩展欧几里德来求解。于是我们求出了(k_1)
    便可以将其带入原来的式子,求出(x=k_1*a_1+r_1)。这是两个方程的求解,面对多个方程,我们可以这样做:
    假设我们刚才求出的是(x_1),而为了求出满足三个方程的解(x_2)我们可以得到这样的式子
    (egin {cases} x_2mod lcm(a_1,a_2)=x_1\ x_2mod a_3=r_3end{cases})
    证明:

    (x_2=k_3*lcm(a_1,a_2)+x_1) ,因为(k_3*lcm(a_1,a_2))这一块肯定能整除(a_1)(a_2),所以肯定会剩下一个(c_1),而(c_1)恰好满足前面的方程

    用同样的方法,我们可以求出满足所有式子的解。

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <queue>
    #include <algorithm>
    #include <cstring>
    #include <climits>
    #define MAXN 10000+10
    #define abs(a) a>0?a:-a
    using namespace std;
    long long e_gcd(long long a,long long b,long long& x,long long& y)
    {
    	if(!b)
    	{
    		x=1;y=0;
    		return a;
    	}
    	long long ans=e_gcd(b,a%b,x,y);
    	long long tmp=x;
    	x=y;
    	y=tmp-a/b*y;
    	return ans;
    }
    long long a1,a2,b1,b2,x,y,gcd,t,c;
    int main()
    {
    	while(scanf("%lld",&t)!=EOF)
    	{
    		scanf("%lld%lld",&a1,&b1);
    		int flag=0;
    		if(t==1) 
    			printf("%lld
    ",b1);
    		else
    		{
    			for(int i=2;i<=t;i++)
    			{	
    				scanf("%lld%lld",&a2,&b2);
    				if(flag)  continue;
    				gcd=e_gcd(a1,a2,x,y);
    				if((b2-b1)%gcd!=0) {flag=1;}
    				x*=(b2-b1)/gcd;
    				x%=a2/gcd;
    				if(x<0) x+=abs(a2/gcd);
    				c=a1*x+b1;
    				a1=a1/gcd*a2; b1=c;
    			}
    		}
    		if(flag==1) {printf("-1
    ");continue;}		
    		printf("%lld
    ",c);
    		
    	}
    	
    	return 0;
    }
    
    
  • 相关阅读:
    js splice 属性实现数组的删除,插入,替换
    js var多等式变量的定义
    SQL Server 收缩数据库
    sql2005 全文索引
    显示器分辨率推荐
    使用javascript打开链接的多种方法
    运算优先级
    jqGrid
    asp.net IE 页面刷新固定位置
    Left Join ,On Where
  • 原文地址:https://www.cnblogs.com/yangyaojia/p/6421628.html
Copyright © 2011-2022 走看看