extend_gcd求解不定方程/膜线性方程/乘法逆元

形如a*x+b*y=c

为不定方程,a,b>0其实无所谓,因为gcd(a,b)=gcd(|a|,|b|)   //gcd为最大公约数

由数论的定理所知,当c%gcd==0,不定方程有解,现在我们来求这个解.

gcd=gcd(a,b);a*b=gcd*lcm;  //lcm为最小公倍数

a‘=a/gcd;b‘=b/gcd;c‘=c/gcd; a‘目前与b‘互质

令c‘‘=1=a‘*x+b‘*y;

利用extend_gcd求出一组特解。(x0,y0)

(x0*c‘.y0*c‘)为 a‘*x+b‘*y=c‘的一组特解

由方程解的思想求出其通解;x=x0*c‘+b‘*t;    y=y0*c‘-a‘*t;再用通解去求解题目

今天花了一晚上时间纠结了一个显而易见的问题。果然当局者迷。

我现在就想大笑一场。哈哈哈哈哈哈哈哈

UVA,10413

题目意思:t个case,n个野人,C,P,L分别代表初始洞穴,隔天移动洞穴数,存活天数。

问:最小的洞穴数,使得在n个野人在各自存活期不遇见。

数据:1*10^6 可以接受,所以此题以初值为野人中初始洞穴最大数,枚举就可以过了。

源代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4
 5 using namespace std;
 6
 7 int x,y,gcd,n;
 8 int C[20],P[20],L[20];
 9
10 void extend_gcd(int a,int b)
11 {
12     if(b==0)
13     {
14         x=1;
15         y=0;
16         gcd=a;
17         return;
18     }
19     extend_gcd(b,a%b);
20     int tmp=x;
21     x=y;
22     y=tmp-a/b*y;
23     return;
24 }
25
26 bool solve(int i,int j,int m)
27 {
28     int c=C[i]-C[j];
29     int b=m;
30     int a=P[j]-P[i];
31     extend_gcd(a,b);
32     if(c%gcd) return false;
33     x*=c/gcd;
34     if(gcd<0) gcd=-gcd;
35 //因为x=x+b/gcd*k,所以x中包含了若干个b/gcd的代数和差
36 //因此用x对b/gcd取模,注意负数得x的最小正值
37     x=(x%(b/gcd)+b/gcd)%(b/gcd);
38     if(x<=L[i] && x<=L[j])
39         return true;
40     return false;
41 }
42 bool test(int m)
43 {
44     for(int i=0;i<n-1;i++)
45         for(int j=i+1;j<n;j++)
46         {
47             if(solve(i,j,m)) return false;
48         }
49     return true;
50 }
51
52
53 int main()
54 {
55     int t;
56     scanf("%d",&t);
57     while(t--)
58     {
59         scanf("%d",&n);
60         int lb=0;
61         for(int i=0;i<n;i++)
62         {
63             scanf("%d %d %d",C+i,P+i,L+i);
64             lb=max(lb,C[i]);
65             C[i]--;
66         }
67         while(lb<=1000000)
68         {
69             if(test(lb)) break;
70             lb++;
71         }
72         printf("%d\n",lb);
73     }
74     return 0;
75 }
76 //提供测试数据
77 Sample Input
78 2
79 3
80 1 3 4
81 2 7 3
82 3 2 1
83 5
84 1 2 14
85 4 4 6
86 8 5 9
87 11 8 13
88 16 9 10
89 Sample Output
90 6
91 33
时间: 2024-11-09 13:06:40

extend_gcd求解不定方程/膜线性方程/乘法逆元的相关文章

乘法逆元 求解及应用

乘法逆元定义 假设a,x,b为整数,b>1,且有$ax \equiv 1(\mod b)$成立 那么a,x互为膜b的逆元 通俗一些,即两数乘积膜p等于1,则他们互为b的逆元 ************************ 逆元算法求解 扩展欧几里得 既然已有同余式$ax \equiv 1(\mod b)$ 那么我们可以将其转化为$ax+by=1$ 可以用扩展欧几里得算法求出其最小非负整数解即为a在膜b意义下的逆元 不会扩展欧几里得算法看这里 扩展欧几里得 推导及应用 void exgcd(in

COJ 1163 乘法逆元的求解

乘法逆元就是求一个 a/b = c(mod m)在已知a%m , b%m 的条件下 求c的解 1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 #define ll long long 6 const int N = 100005; 7 int val[N]; 8 9 ll ex_gcd(ll a , ll b , ll &x , ll &y) 10 { 11 if(b == 0)

扩展欧几里得与乘法逆元

一.欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 递归实现: 1 int gcd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 return 6 gcd(b,a%b); 7 } 优化 1 int gcd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 re

Light OJ 1067 Combinations (乘法逆元)

Description Given n different objects, you want to take k of them. How many ways to can do it? For example, say there are 4 items; you want to take 2 of them. So, you can do it 6 ways. Take 1, 2 Take 1, 3 Take 1, 4 Take 2, 3 Take 2, 4 Take 3, 4 Input

[模板]乘法逆元

本博客所有代码基于题目 luogu_P3811 逆元: 一般用于求 (a/b) mod p  定义: 若 a*x ≡ 1 (mod p) ,且 a 与 p 互质,那么我们就能定义: x 为 a 的逆元,记为 a^-1 ,所以我们也可以称 x 为 a 的倒数(mod p意义下). 所以对于 (a/b) mod p ,我们就可以求出 b 在 mod p 意义下的逆元,然后乘上 a ,再 mod p ,就是这个乘法逆元的值了. 求法: First:费马小定理 定理内容:如果 a , p 互质,那么 a

数论学习之乘法逆元

用法:用于除法取模 思路:扩欧 要求:b.p互质 设k为b的乘法逆元: 则在求解除法取模问题时: 有(a/b)%p =>(a*k)%p 当b很大时,用除法会出现精度问题..so 乘法逆元: 如果b*k ≡ 1 (mod p) 则称k是b关于p的乘法逆元 我们可以通过求 b 关于 p 的乘法逆元 k,将 a 乘上 k 再模 p,即 (a * k) mod p.其结果与(a / b) mod p等价. 证: 因为 b * k ≡ 1 (mod p) 则有 b * k = p* x+1 得到 k =

HDU1576 A/B(乘法逆元)

这题大概是,整数模9973乘法群?然后存在乘法逆元. 于是题目要求$A \div B \pmod {9973} $其实就相当于求$A \times B^{-1}\pmod {9973} $. 只要求出B的逆元就OK了. 计算模n下的乘法逆元可以用用扩展欧几里得算法求解,即解下面的线性同余方程: $$ Ax \equiv 1 \pmod {n} $$ 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 #de

求乘法逆元的几种方法

(数学渣,下面的文字可能有误,欢迎指教)乘法逆元的定义貌似是基于群给出的,比较简单地理解,可以说是倒数的概念的推广.记a的关于模p的逆元为a^-1,则a^-1满足aa^-1≡ 1(mod p) 加减乘与模运算的顺序交换不会影响结果,但是除法不行.有的题目要求结果mod一个大质数,如果原本的结果中有除法,比如除以a,那就可以乘以a的逆元替代. 在mod p的运算中,a存在乘法逆元当且仅当a与p互质.一般题目给的是一个大质数,所以只要a不是p的倍数,就以求乘法逆元. 目前了解到的求法有三种:1.扩展

扩展欧几里得算法、裴蜀定理与乘法逆元

扩展欧几里得算法 扩展欧几里得算法(扩O)能在求gcd(a,b)的同时求出丢番图方程ax+by=gcd(a, b)的解. 然而怎么求呢?我们观察gcd(a, b)=gcd(b, a%b),所以设如下两个方程: ax+by = gcd(a,b) = d: bx'+(a%b)y' = gcd(b,a%b): 明显gcd(a,b) = gcd(b,a%b),也就是ax+by = bx'+(a%b)y'. 为了求得x与y,我们需要保证a,b不变,所以:ax+by = bx'+(a%b)y' = bx'+