求解模线性方程

    推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b。
    推论2:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a,n),或者无解。
    定理1:设d=gcd(a,n),假定对整数x和y满足d=ax+by(比如用扩展Euclid算法求出的一组解)。如果d | b,则方程ax=b(mod n)有一个解x0满足x0=x*(b/d) mod n 。特别的设e=x0+n,方程ax=b(mod n)的最小整数解x1=e mod (n/d),最大整数解x2=x1+(d-1)*(n/d)。
    定理2:假设方程ax=b(mod n)有解,且x0是方程的任意一个解,则该方程对模n恰有d个不同的解(d=gcd(a,n)),分别为:xi=x0+i*(n/d) mod n 。

求所有解的伪代码如下:

题目:poj 2115

思路:求A+x*C== B(mod 2^k ) 是否有解

若其有解,则xC == B-A(mod 2^k) 也有解;

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdlib.h>
 4 #include <time.h>
 5 #include <cmath>
 6 #include <cstdio>
 7 #include <string>
 8 #include <cstring>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <set>
13
14 #define c_false ios_base::sync_with_stdio(false); cin.tie(0)
15 #define INF 0x3f3f3f3f
16 #define INFL 0x3f3f3f3f3f3f3f3f
17 #define zero_(x,y) memset(x , y , sizeof(x))
18 #define zero(x) memset(x , 0 , sizeof(x))
19 #define MAX(x) memset(x , 0x3f ,sizeof(x))
20 #define swa(x,y) {LL s;s=x;x=y;y=s;}
21 using namespace std ;
22 typedef long long LL;
23 const int N = 1e5 + 7;
24
25 LL ex_gcd(LL a, LL b, LL &x, LL &y) {
26     LL d;
27     if (b == 0) {
28         x = 1; y = 0;
29         return a;
30     } else {
31         d = ex_gcd(b, a%b, y, x);
32         y -= a/b*x;
33         return d;
34     }
35 }
36
37 LL Linear(LL a, LL b, LL c){
38     LL d, e, x, y;
39     d = ex_gcd(a, c, x, y);
40     if(b%d){
41         return -1;
42     }
43     e = x * (b/d) % c +c;
44     return e % (c/d);
45 }
46
47 int main(){
48     //freopen("in.txt","r",stdin);
49     //freopen("out.txt","w",stdout);
50     //ios_base::sync_with_stdio(false); cin.tie(0);
51     long long d,a,b,c,k;
52     while(scanf("%I64d %I64d %I64d %I64d",&a,&b,&c,&k),a||b||c||k){
53         d=Linear(c,b-a,1LL<<k);
54         if(d==-1)
55             puts("FOREVER");
56         else
57             printf("%I64d\n",d);
58     }
59     return 0;
60 }

时间: 2024-10-16 15:24:40

求解模线性方程的相关文章

POJ2115——C Looooops(扩展欧几里德+求解模线性方程)

C Looooops DescriptionA 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, repea

算法总结之求解模线性方程组

1)求解模线性方程 ax = b(mod n) 方程ax = b(mod n) -> ax = b + ny ->ax - ny = b -> ax + n (-y) =b 其中a,n,b已知. 可用扩展欧几里得来求解该方程的一组特解. 这里给出下列几个定理用来求解方程: 1.当且仅当d|b时,方程ax = b(mod n)有解.d=gcd(a,n) 2.ax = b(mod n) 或者有d个不同解,或者无解. 3.令d=gcd(a,n) 假定对整数x', y', 有d = ax' +

POJ 2142 TheBalance 模线性方程求解

题目大意: 就是将两种砝码左右摆放,能够在物品放置在天平上时保持平衡 很容易得到 ax + by = t的模线性方程 按题目要求,希望首先满足 |x| + |y| 最小 , 如果有多种情况,再满足所有砝码质量最小,也就是a|x| + b|y|最小 x = x0 + b/g * k y = y0 - a/g * k 这里可以通过画一个2维坐标图进行观察 x , y 对于k的直线,我假定 b > a ,初始如果 a>b就交换两者数据,记得最后答案交换回来 因为a,b为砝码重量都大于0 所以x是递增

poj 2947 Widget Factory (高斯消元,解模线性方程)

链接:poj 2947 题意:生产一些零件,已知零件种数,记录条数 记录只记录了某次生产从周几开始,周几结束,以及生产了哪些产品. 每件商品生产所需天数为3-9天. 求每样产品需要多少天才能完成. 若无解输出Inconsistent data. 有无穷解输出Multiple solutions. 有唯一解,输出其解 分析:根据题目所给信息,可以列出同余方程组,再根据高斯消元求解, 但还得判断是无解,无穷解,还是唯一解 1.系数矩阵的秩若与增广矩阵的秩不相等,则无解,否则有解 2.若有解,若增广矩

POJ 2115 C Looooops(模线性方程)

http://poj.org/problem?id=2115 题意: 给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER. 思路: 根据题意原题可化成c * x = b - a mod (2 ^ k),然后解这个模线性方程. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio>

POJ 2115 (模线性方程 -&gt; 扩展欧几里得)

题意: for(i=A ; i!=B ;i +=C)循环语句,问在k位操作系统中循环结束次数. 若在有则输出循环次数. 否则输出死循环. 存在这样的情况:i= 65533 :i<=2:i+= 4:时i = 2: 由模线性方程->扩展欧几里得 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using

模线性方程 poj2115

1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 long long exgcd(long long a,long long b,long long &x,long long &y) 7 { 8 if(b==0) 9 { 10 x=1; 11 y=0; 12 return a; 13 } 14 long long ret=exgcd(b,a%b,x,y); 15 long l

POJ 2115 模线性方程 ax=b(mod n)

/* (x*c+a)%(2^k)==b →(x*c)%(2^k)==b-a 满足定理: 推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b. 推论2:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a,n),或者无解. 定理1:设d=gcd(a,n),假定对整数x和y满足d=ax+by(比如用扩展Euclid算法求出的一组解). 如果d | b,则方程ax=b(mod n)有一个解x0满足x0=x*(b/d) mod n .特别的设e=x0+

poj 2115 (解单变元模线性方程)

http://poj.org/problem?id=2115 题意: 给出a,b,c,k,求x,使得(a+c*x)%(2^k)=b 限制: 0 <= a,b,c < 2^k; 1 <= k <= 32 思路: 拓展欧几里得单变元模线性方程 令 A=c;C=((b-a)%(2^k)+2^k)%(2^k);B=2^k 则这道题就化为Ax%n=B 对于Ax%B=C -> Ax+By=C -> d=Ext_gcd(A,B,x,y) //d其实为gcd(A,B) -> if