zoukankan      html  css  js  c++  java
  • POJ 2891 Strange Way to Express Integers 中国剩余定理解法

    一种不断迭代,求新的求余方程的方法运用中国剩余定理。

    总的来说,假设对方程操作。和这个定理的数学思想运用的不多的话。是非常困难的。


    參照了这个博客的程序写的: http://scturtle.is-programmer.com/posts/19363.html


    这个博客举例说的挺好的:http://blog.csdn.net/mishifangxiangdefeng/article/details/7109217

    hdu 3579 Hello Kiki 中国剩余定理(不互质的情况)
    对互质的情况,处理起来比較方便,能够直接套模板
    本题给出不互质的模线性方程组,求出满足方程的最小正整数解
    方案:对于不互质的模线性方程组,能够进行方程组合并。求出合并后的方程的解。这样就能够非常快地推出方程的终于解。


    两个方程合并的一种方法:
    x = c1 (mod b1)
    x = c2(mod b2) 
    此时b1,b2不必互质的。
    显然能够得到x = k1 * b1 + c1   x = k2* b2 + c2。
    两个方程合并一下就能够得到:k1 * b1 = c2 - c1 (mod b2),
    这样能够设g=gcd(b1,b2),于是就有b1/g*k1-b2/g*k2=(c2-c1)/g,
    显然推断(c2-c1)/g是否为整数就能推断是否存在解。
    这样在经过类似的变换就能得到k1 = K (mod (b2/g)),
    最后得到x = K*b1 + c1 (mod (b1 * b2/g))。
    对于题目所给正整数的要求,仅仅有一种反例,就是结果输出为0的情况,

    这个能够特殊考虑。仅仅须要考虑全部数的最小公倍数就可以。


    各个式子各个变量的含义都须要理解才干写好这个程序;最后0MS过。这个程序竟然上榜了。

    __int64 s, t, g;
    
    void extGCD(__int64 a, __int64 b)
    {
    	if (b == 0)
    	{
    		s = 1, t = 0, g = a;
    	}
    	else
    	{
    		extGCD(b, a % b);
    		__int64 tmp = s;
    		s = t;
    		t = tmp - a / b * t;
    	}
    }
    
    int main()
    {
    	__int64 m1, m2, r1, r2, m10, m20, c;
    	int n;
    
    	while (scanf("%d", &n) != EOF)
    	{
    		bool flag = false;
    		scanf("%lld %lld", &m1, &r1);
    
    		for (int i = 1; i < n; i++)
    		{
    			scanf("%lld %lld", &m2, &r2);
    			if (flag) continue;
    			extGCD(m1, m2);//由于定理条件是除数互质,所以除以公约数使得其互质
    			c = r2 - r1;//k1*m1 == (r2 - r1) (mod m2)
    			if (c % g)
    			{
    				flag = true;
    				continue;
    			}
    			m20 = m2 / g;//这个为新的mod除数。和以下新的m1互质
    			c /= g;
    			__int64 r0 = (c * s % m20 + m20) % m20;
    			r1 = r0 * m1 + r1;
    			m1 = m1 * m20;//得到新式子的系数: m1 * x + r1 == r2 即:x = r1, r2...(mod m1, m2)
    		}
    		if (flag) puts("-1");
    		else printf("%lld
    ", r1);
    	}
    	return 0;
    }




  • 相关阅读:
    BeyondLinux_Since1991
    TED系列:我们究竟在教AI学习什么
    TED系列:算法的影响
    TED系列:代码-下一代的通用语言
    TED系列:互联网源起故事
    Hadoop-01 搭建hadoop伪分布式运行环境
    JavaSE-26 Swing
    JavaSE-25 AWT
    JavaSE-24 多线程
    JavaSE-23 注解
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6872617.html
Copyright © 2011-2022 走看看