摘要: 这题是一道非常直接的中国剩余定理的题目,但是这里的不同的给定的几个数不一定是互质的。因此也就不能直接用解中国剩余定理的方法来求了。我们通过迭代法来求解最后的答案。设有 x = 1(mod 5) y = 2(mod 6) z = 3(mod 7)那么根据第一个方程我们设 x = 5t+1, 代入到第二个方程 5t+1 = 2(mod 6) ==> 5t -6u = 2-1 左边这个式子就可以用扩展GCD求出t的解,我们知道t的解由两部分组成,一部分是我们解出来的一般解5(必须保证为最小的正整数),此时u等于4,另外的就是加上 k 个 6 / gcd(5, 6)了,那么我们可以得到 t =. 阅读全文
posted @ 2012-07-21 18:08 沐阳 阅读(341) 评论(0) 推荐(1) 编辑
摘要: 这题就是一个简单扩展GCD,方程为 x*C + y * 2^k = B-A.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long int Int64;Int64 A, B, C, K;Int64 _pow(Int64 a, Int64 b){ Int64 ret = 1; while (b) { if (b & 1) { ret *= a; } ... 阅读全文
posted @ 2012-07-21 15:44 沐阳 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int b[4], D;int ext_gcd(int a, int b, int &x, int &y){ int ret, temp; if (b == 阅读全文
posted @ 2012-07-21 12:24 沐阳 阅读(191) 评论(0) 推荐(0) 编辑