解线性同余方程组-模板

 1 int n;
 2 LL a[K],b[K];
 3 LL gcd(LL a,LL b)
 4 {
 5     return b==0?a:gcd(b,a%b);
 6 }
 7 void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
 8 {
 9     if(b==0)
10     {
11         x=1;y=0;d=a;
12         return;
13     }
14     exgcd(b,a%b,d,y,x);
15     y-=x*(a/b);
16 }
17 LL slove(void)//x=b[i](mod a[i])
18 {
19     LL ta=a[0],tb=b[0];
20     bool flag=true;
21     for(int i=1;i<n;i++)
22     {
23         LL xa=ta,xb=a[i],c=b[i]-tb,d,x,y;
24         exgcd(xa,xb,d,x,y);
25         if(c%d)
26         {
27             flag=false;break;
28         }
29         LL tm=xb/d;
30         x=(x*(c/d)%tm+tm)%tm;
31         tb=ta*x+tb;
32         ta=ta/d*a[i];
33     }
34     if(!flag)
35         return -1;
36     return tb;
37 }

解出的是最小正整数解

时间: 2024-10-17 07:15:51

解线性同余方程组-模板的相关文章

HDU1573:X问题(解一元线性同余方程组)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题就是求解一元线性同余方程组的解满组小于正整数n的数目.最小正整数的解为X=(X*(c/d)%t+t)%t;  X=a1*X+r1;其中X为扩展欧几里得解出来的特解,这m个方程组的循环区间为lcm(a1,a2,a3...am),所以答案为(n-X)/lcm+1; #include <iostream>

HDU3579:Hello Kiki(解一元线性同余方程组)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lcm(a1,a2,a3,...an). 别的就没什么注意的了. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h&

HDU1573 X问题【一元线性同余方程组】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目大意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路: 先求出数组b[]中所有数的最小公倍数lcm,再求解出该一元线性同余方程组在lcm范围内的解为a,题目要 求解x是小于等于N的正整数,则

求解一元线性同余方程组模版

解法:直接上模版. 扩展欧几里德的模版: typedef long long LL; LL ex_gcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1; y=0; return a; } LL d=ex_gcd(b,a%b,x,y); LL t=x; x=y; y=t-a/b*y; return d; } 求解一元线性同余方程组模版: LL solve(LL n) { LL a1,r1,a2,r2; LL a,b,c,r,x,y; bool ifhave=

poj3708(公式化简+大数进制装换+线性同余方程组)

刚看到这个题目,有点被吓到,毕竟自己这么弱. 分析了很久,然后发现m,k都可以唯一的用d进制表示.也就是用一个ai,和很多个bi唯一构成. 这点就是解题的关键了. 之后可以发现每次调用函数f(x),相当于a(ai),b(bi)了一下.这样根据置换的一定知识,一定会出现循环,而把循环的大小看成取模,把从m->k的看成余,于是可以建立一个线性同余方程. 直接用模板解决之.. Recurrent Function Time Limit: 1000MS   Memory Limit: 65536K To

POJ2115 C Looooops【解线性同余方程】

题目链接: http://poj.org/problem?id=2115 题目大意: 对于循环语句: for(int i = A; i != B; i += C) 语句1: 已知i.A.B.C都是k进制的无符号整数类型,给出A.B.C.k的值,计算并输出语句1 的执行次数,如果为无限次,那么直接输出"FOREVER". 思路: 设算法执行X步,那么题目就变为求解A + CX ≡ B( mod M)(M= 2^k).即A + CX + MY ≡ B. CX + MY ≡ B - A(M

HDU-1573-X问题(线性同余方程组)

链接: https://vjudge.net/problem/HDU-1573 题意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路: 解线性同余方程组,得到\(x+k*m \leq n\). 解为\(1+(n-x)/m\). 当x为0时答案要减一. 代码: #include<iostream

(解一元线性同余方程组)

转载: /**********************一般模线性方程组***********************/ 同样是求这个东西.. X mod m1=r1 X mod m2=r2 ... ... ... X mod mn=rn 首先,我们看两个式子的情况 X mod m1=r1……………………………………………………………(1) X mod m2=r2……………………………………………………………(2) 则有 X=m1*k1+r1………………………………………………………………(*)

HDU3579 Hello Kiki【一元线性同余方程组】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目大意: Kiki有X个硬币,她用不同的方式数了N次,每次她把硬币分成大小相等的组,记录每次一组硬币 的个数Mi和数完最后剩余的硬币数Ai.那么问题来了:总共有多少枚硬币? 思路: 典型的一元线性同余方程组X = Ai(mod Mi)求解.题目要求输出最小正整数解,则如果求得同余 方程组的解为0,那么答案就是所有Mi的最小公倍数. AC代码: #include<iostream> #in