补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)…
题意:就是看看for(; ;)多久停止. 最让我蛋疼的是1L和1LL的区别!让我足足wa了12发! 1L 是long类型的, 1LL为long long类型的! 思路: 这就是欧几里德扩展的标准式子了. ac代码: #include<cstdio> using namespace std; #define ll long long void exgcd(ll a, ll b, ll &d,ll &x, ll &y) { ; y = ; } else{ exgcd(b,…
题目大意:很好理解,一个for循环语句,从a开始到b结束,步长是c,模数是pow(2,k) 问,最少循环多少次,才能到达b,如果永远都到不了b,输出FOREVER 题解:其实就是求一个线性方程,cx=b( mod p).问x最小是多少. 这个线性方程怎么来的呢?从a开始假设我们走了x步,到达了b,则a+cx=b( mod p)将a移到右边可得cx=(b-a)( mod p). 这个线性方程怎么解呢? 假设cx在取了y次模得到了(b-a),那么cx-py=(b-a),也就是解这个二元一次方程. 很…
一个编译器之谜:我们被给了一段C++语言风格的循环 for(int i=A;i!=B;i+=C) 内容; 其中所有数都是k位二进制数,即所有数时膜2^k意义下的.我们的目标时球出 内容 被执行了多少次. Input 输入包含若干组.每组被描述为一个单身的行有四个正整数 A, B, C, k 被一个单身的空格分开.输入以0 0 0 0结束.1 <= k <= 32, 0 <= A, B, C < 2 k Output 输出包含若干行表示每组数据的答案,若该循环不会停止则输出一行&qu…
题目链接:https://cn.vjudge.net/contest/276376#problem/B 题目大意:for( int  i= A ; i != B; i+ = c ),然后给你A,B,C,K,前三个是for循环里面的变量,K指的是每一次ABC三个数都对2^k进行取余,然后问你要使得这个循环停止,最少的循环次数,如果是一个死循环,就输出"FOREVER". 具体思路:和我之前写的那一篇博客思路差不多,证明过程直接上图. 一开始没有注意到B,等号右边应该是B-A,而不是B,以…
数论好题.. 香! 首先我们看到这一题, 题意是 \[a + c * x \equiv b (mod \ \ 2 ^ k) \] 对此式移一下项, 得 \[c * x \equiv b - a (mod \ \ 2 ^ k) \] 此时原式为标准线性同余方程. \(exgcd\)解得\(x\)后,x 要做如下处理 : 设\(g = gcd(b - a, 2 ^ k), k = 2 ^ k, d = b - a\) 1#. \(x = x * (d / g)\), 此时求得一组特解(因为\(exg…
A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed…
POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A (因为要满足B大于A)即是Exgcd的标准式子了 代码 #include<iostream> #include<cstdio> using namespace std; #define ll long long ll A,B,C,T,k; int gcd(ll a,ll b) { i…
题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod(2^k)的最小解.(真搞不懂为什么训练的时候好多人把青蛙的约会都给做出来了,这题却一直做不出来.. . . . 这两道不都是推公式然后变形吗. .... ) 代码例如以下: #include <iostream> #include <cstdio> #include <strin…
gcd算法是用来求两个数最大公约数的算法,他是依靠辗转相除(中国好像叫辗转相减)法来求两个数的最大公约数,别的地方也有很多介绍不做过多赘述,主要提供代码供自己参考. gcd(int a,int b) { ?a:gcd(b,a%b); } 对于拓展gcd,是对方程ax+by=c求解: 就是a mod b=c这个方程求解: 具体看代码,不做过多赘述因为别人已经讲的很详细了,在这里copy一下别人的讲解: 我们其实只需要考虑形如 a • x mod n = 1 的方程.因为,如果能解出这样的方程, a…
礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\) 注意到若\[p=\prod_{i=1}^{k}{p_i}^{c_i},则\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\] 于是有一个经典套路就是,求出\(k\)组\(A_i=C(n,m)\% {p_i}^{c_i}\)…
乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用 给出拓展GCD算法: 扩展欧几里得算法是指对于两个数a,b 一定能找到x,y(均为整数,但不满足一定是正数) 满足x*a+y*b=gcd(a,b) gcd(x,y)是指x 与 y的最大公约数 有啥用呢?求解形如 a*x +b*y = c 的通解 然后我们先介绍同余方程,再介绍乘法逆元 同余方程 a≡b(mod m) 等价于小学的运算式 b÷m 余数为a 也就是a mod m=b 其实介绍这个就是看怎么把≡拿掉 乘法逆元 ax ≡ (mo…
poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码: #include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> using namespace std; const int maxn = 10005; const…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 平面图的一个定理:若边数大于(3*点数-6),则该图不是平面图. 然后就可以2-SAT了! 注意把输入读完再用定理continue!!! 注意边是元素,所以是i+m,而且数组也应开成M<<1!!! #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
题意:有一个在k位无符号整数下的模型:for (variable = A; variable != B; variable += C)  statement; 问循环的次数,若"永不停息"(←_←)*,就输出"FOREVER". 解法:用拓展欧几里德方法求出gcd最大公因数,再利用同余性质转化,求同余方程,或者不定方程.其中题目可化为 a+cx=b(mod 2^k) → cx=b-a(mod 2^k),求最小正整数解.也是求解同余方程. 先将方程化为一般形式:ax=…
题目链接 这个题犯了两个小错误,感觉没错,结果怒交了20+遍,各种改看别人题解,感觉思路没有错误,就是wa. 后来看diccuss和自己查错,发现自己的ecgcd里的x*(a/b)写成了x*a/b.还有(LL)1<<k 写成了 (LL)(1<<k),记住了... 题意: 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束. 若在有限次内结束,则输出循环次数. 否则输出死循环.取最小的满足 cx mod (2^k) = b - a的正x.…
http://poj.org/problem?id=2115 题意: 给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER. 思路: 根据题意原题可化成c * x = b - a mod (2 ^ k),然后解这个模线性方程. #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #includ…
题目:http://poj.org/problem?id=2115 exgcd裸题.注意最后各种%b.注意打出正确的exgcd板子.就是别忘了/=g. #include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; ll a,b,x,y,r,A,B,C,k,g; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}…
C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29061   Accepted: 8360 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop w…
扩展GCD...一定要(1L<<k),不然k=31是会出错的 ....                        C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15444   Accepted: 3941 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable…
C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23637   Accepted: 6528 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop w…
分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转化一下形式. 上式可以用同余方程表示为  a + k*c = (b) % (1<<d)   <-->  k*c = (b-a) % (1<<d)(中间应该是全等号,打不出来…).这就是我们想要的同余方程,根据我的个人习惯,我把它转化为线性方程的形式. -->   c*…
题目描述 对于C的for(i=A ; i!=B ;i +=C)循环语句,给出A,B,C和k(k表示变量是在k进制下的无符号整数),判断循环次数,不能终止输出"FOREVER". 输入 多组数据,每组一行,A,B,C,k 程序以0 0 0 0结束 输出 一行一个整数,表示循环次数,或者"FOREVER" 样例输入 3 3 2 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0 样例输出 0 2 32766 FOREVER   这道题翻译一下就是…
[题目链接] http://poj.org/problem?id=2115 [题目大意] 求for (variable = A; variable != B; variable += C)的循环次数, 其中变量为k比特无符号整数. [题解] 题目等价于求解Cx=(B–A)(mod 2^k),利用扩展欧几里得算法可以求解该问题 [代码] #include <algorithm> #include <cstring> #include <cstdio> using name…
C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23616   Accepted: 6517 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop w…
很容易看出来一个同余式,说到底是解一个线性同余方程,计算机解通常有拓展欧几里得和欧拉定理两种算法,参照去年的NOIP水题,问题是这题数据范围是2^32所以要int64 TAT #include<cstdio> #include<iostream> #include<string.h> #include<math.h> using namespace std; __int64 exgcd(__int64 a,__int64 b,__int64&x,__…
题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long l…
辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } 扩展欧几里得算法 时间复杂度和欧几里得算法相同 int extgcd(int a, int b, int& x, int& y) { int d = a; if (b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x;…
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22704 Accepted: 6251 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop which…
Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop which starts by setting variable to value A and <= x < 2k) modulo 2k. Input The input consists…