中国剩余定理

【洛谷P2480】古代猪文

江枫思渺然 提交于 2019-12-01 02:09:49
题目大意:求 \[ G^{\sum\limits_{d|N}\binom{n}{k}} mod\ \ 999911659 \] 题解:卢卡斯定理+中国剩余定理 利用卢卡斯定理求出指数和式对各个素模数的解,再利用中国剩余定理合并四个解即可。 也可以在枚举 N 的因子的过程中,对于计算的四个解直接进行中国剩余定理的合并,答案不变。 代码如下 #include <bits/stdc++.h> using namespace std; typedef long long LL; const LL mod = 999911658; const LL md[] = {2, 3, 4679, 35617}; const int maxn = 40000; LL fac[maxn]; inline LL fpow(LL a, LL b, LL c) { LL ret = 1 % c; for (; b; b >>= 1, a = a * a % c) { if (b & 1) { ret = ret * a % c; } } return ret; } inline LL comb(LL x, LL y, LL p) { if (y > x) { return 0; } return fac[x] * fpow(fac[x - y], p - 2, p) % p * fpow(fac[y], p

打 板 子

北战南征 提交于 2019-11-30 16:29:05
记录打板子的速度...(争取每周都打一轮) 数据结构:   并查集   Trie   可持久化Trie   树状数组   线段树   树链剖分   Splay   动态树   主席树   树套树   分块   点分治   cdq分治   整体二分   莫队   带修莫队   树上莫队   树上带修莫队 数学   线性筛   数论分块   gcd   exgcd   线性求逆元 欧拉定理   中国剩余定理   ex中国剩余定理   卢卡斯定理   莫比乌斯函数   0/1分数规划     欧拉函数   矩阵乘法   高斯消元   BSGS   FFT   NTT   杜教筛 图论: kruskal prim   tarjan-LCA   倍增LCA   基环树   点双   边双   缩点   网络流   费用流 来源: https://www.cnblogs.com/Hikigaya/p/11604269.html

中国剩余定理

空扰寡人 提交于 2019-11-30 05:51:44
对于 \(n\) 个方程组成的方程组组 \[ \left\{ \begin{aligned} x\equiv A_1 (mod && B_1) \\ x\equiv A_2 (mod && B_2)\\\dots \\x\equiv A_i (mod && B_i) \end{aligned} \right. \] --- 设 \(mul=\Pi_{i=1}^{i<=n} B_i\) , \(T_i\) 为 \(M_i\) 在 \(\mod B_i\) 意义下的逆元, \(M_i=\frac{mul}{B_i}\) 则 \(ans=\sum M_i\times T_i \times A_i\) \(M_i\) 个人认为用来抵消 然后,妙啊 #include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #include<map> #include<queue> #include<iostream> #include<cmath> //#define int long long using namespace std; inline int gi(){char tmp=getchar();int flag=1;while(tmp<'0'||tmp>'9'){if(tmp=='-'){flag=-1

中国剩余定理学习笔记

↘锁芯ラ 提交于 2019-11-30 05:41:15
中国剩余定理学习笔记。 前置技能:扩展欧几里得算法。 中国剩余定理 对于这样一个模方程组: \[ \begin{cases} x=r_1\%m_1 \\ x=r_2\%m_2 \\ ...... \\ x=r_n\%m_n \end{cases} \] 其中 \(m_1,m_2,...m_n\) 两两互质。 求 \(x\) 的最小正整数解。 定理: 有 \(M=\prod_{i=1} ^{n}m_i\) ,因为其两两互质,所以 \(M\) 为他们的最小公倍数。 \(t_i\) 为方程$ \frac M{m_i}*t_i=1(mod,m_i) $的解 很显然可以利用扩展欧几里得解出 \(t_i\) 对于当前的模方程,我们只用和上一组通解合并即可。 通解为 \(x_i=x_0+i*M\) ; 代码 #include<bits/stdc++.h> using namespace std; int a[15],b[15]; void exgcd(int a,int b,int &d,int &x,int &y) { if(b)exgcd(b,a%b,d,y,x),y-=(a/b)*x; else d=a,y=0,x=1; } int main() { int n,ans=0,sum=1,d,y; scanf("%d",&n); for(int i=0; i<n; i++) scanf("

学习拓展中国剩余定理小结

瘦欲@ 提交于 2019-11-29 11:44:57
前言 话说中国剩余定理好早就会了,但是一直木有接触过拓展的。 只知道它是个什么东东。 最近似乎需要它了,稍微学了学,似乎还挺简单的。 小结一下~ 简介 中国剩余定理我们都懂吧? 而拓展则是把它后面的模数变成一个非质数,(当然,各个方程的模数互质)。 然后求出最小的x的解。 做法 似乎拓展之后很难用原来的套路来搞了。 怎么办? 我们发现,我们可以利用一些奇怪的推柿子大法来合并柿子。 考虑合并一下两个柿子: \(x \equiv c1 (mod\ m1)\) \(x \equiv c2 (mod\ m2)\) 转化一下: \(x=c1+m1*k1\) \(x=c2+m2*k2\) 合并、移项 \(m1*k1=c2-c1+m2*k2\) 设 \(g=gcd(m1,m2)\) 柿子两边同除g得: \(\frac{m1}g*k1=\frac{c2-c1}g+\frac{m2}g*k2\) 我们考虑转化一下: \(\frac{m1}g*k1 \equiv \frac{c2-c1}g (mod\ \frac{m2}g)\) 当然,这个时候我们发现, \(\frac{c2-c1}g\) 这条柿子一定要是整数,否则就有小数了,判断一下。 于是,现在我们已经去掉了一个k2了,但是左边依然很不优美,接下来考虑化简一波。 设 \(ny()\) 表示求逆元。 \(k1\equiv ny(\frac{m1}g

中国剩余定理及扩展中国剩余定理

蹲街弑〆低调 提交于 2019-11-29 06:14:10
目录 中国剩余定理CRT 扩展中国剩余定理ExCRT TJOI2009 猜数字 HDU 1573 X问题 中国剩余定理CRT 中国剩余定理是用来求线性同于方程组的。 \[ \begin{aligned} \left \{ \begin{matrix} x \equiv c_1 (mod \,\,m_1 )\\ x \equiv c_2 (mod \,\,m_2 )\\ ...\\ x \equiv c_n(mod \,\, m_n) \end{matrix} \right. \end{aligned} \] 中国剩余定理是这样来的。 我们先考虑如下几个方程组: \[ \begin{aligned}\left \{ \begin{matrix} x_1 \equiv 1 (mod \,\,m_1 )\\ x_1 \equiv 0 (mod \,\,m_2 )\\...\\x_1 \equiv 0(mod \,\, m_n)\end{matrix} \right.,\left \{ \begin{matrix}x_2 \equiv 0 (mod \,\,m_1 )\\x_2 \equiv 1 (mod \,\,m_2 )\\...\\x_2 \equiv 0(mod \,\, m_n)\end{matrix} \right.,\left \{ \begin{matrix}x_n

Biorhythms POJ 1006(中国剩余定理)

大憨熊 提交于 2019-11-29 01:36:53
原题 题目链接 题目分析 由题可知要求解一下方程组 (x+d)≡p(mod23) (x+d)≡e(mod28) (x+d)≡i(mod33) 很明显23 28 33互质,因此这道题只需要用 中国剩余定理的结论 求出ans-x+d,最后ans-d之后用ans=(ans%lcm(23,28,33)+lcm(23,28,33))lcm(23,28,33)取一下最小正解即可,这里要注意一下,当ans是0的时候ans=lcm(23,28,33). 代码 1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <vector> 11 #include <stack> 12 #include <queue> 13 #include <map> 14 #include <set> 15 16 using namespace std; 17 typedef unsigned long long ULL; 18 typedef long long LL; 19

中国剩余定理(普通+扩展)

主宰稳场 提交于 2019-11-28 20:30:58
扩展中国剩余定理(模数不互质) 洛谷P4777 【模板】扩展中国剩余定理(EXCRT) #include<bits/stdc++.h> using namespace std; #define ll long long #define N 100005 ll r[N],p[N]; ll a1,a2,n1,n2; int nn; ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1; y=0; return a; } ll d=exgcd(b,a%b,y,x); y-=a/b*x; return d; } ll mul(ll a,ll x,ll mod) { ll ans=0,m=0; if(x<0) m=1,x=-x; while(x) { if(x&1) ans=(a+ans)%mod; x=x>>1; a=(a+a)%mod; } if(m) return -ans; return ans; } int main() { scanf("%d",&nn); scanf("%lld%lld",&p[1],&r[1]); //r1是前i-1个方程的解 ll r1=r[1],lcm=p[1];//一边使用n次exgcd 一边求lcm for(int i=2;i<=nn;i++) { ll x,y; scanf("%lld%lld",&p[i]

中国剩余定理 快速乘 洛谷P3868

北城余情 提交于 2019-11-28 02:45:10
题目链接: https://www.luogu.org/problem/P3868 题意:就是裸的中国剩余定理,为了防止TLE要加上快速乘,但是要注意a[i]可能为负数,故需要对a[i]做处理:a[i]=(a[i]%b[i]+b[i])%b[i]) #include<iostream> #include<cstdio> #include<vector> #include<queue> #include<algorithm> #include<cstring> using namespace std; typedef long long lt; lt read() { lt f=1,x=0; char ss=getchar(); while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();} while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();} return x*f; } int k; lt a[20],b[20]; lt qmul(lt a,lt b,lt mod) { lt ans=0; while(b>0) { if(b&1) ans=(ans+a)%mod; a=(a+a)%mod; b>>=1; } return ans; } void exgcd(lt a,lt b,lt &x

中国剩余定理 poj1006 模板

六月ゝ 毕业季﹏ 提交于 2019-11-28 01:43:22
题目链接: http://poj.org/problem?id=1006 题意:每个人的体力,情感,智力周期分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。 分析:中国剩余定理的板子题 23,28,33满足两两互质,故直接套板子即可 先上模板: //n个方程:x=a[i](mod m[i]) (0<=i<n) LL china(int n, LL *a, LL *m){ LL M = 1, ret = 0; for(int i = 0; i < n; i ++) M *= m[i]; for(int i = 0; i < n; i ++){ LL w = M / m[i]; ret = (ret + w * inv(w, m[i]) * a[i]) % M; } return (ret + M) % M; } 然后代码 #include<cstdio> typedef long long LL; const int N = 100000 + 5; void ex_gcd(LL a, LL b, LL &x, LL &y, LL &d){ if (!b)