## 数论_CRT（中国剩余定理）& Lucas （卢卡斯定理）

### 正文

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

typedef long long ll;
const int maxn = 111;

// m为模数组，a为余数数组，0~n-1
ll m[maxn], a[maxn];

ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
ll ans = exgcd(b, a % b, y, x);
y -= a / b * x;
return ans;
}

ll excrt() {
ll lcm = m[0], last_a = a[0];
for(int i = 1; i < n; i++) {
ll lcm_a = ((a[i] - last_a) % m[i] + m[i]) % m[i];
ll k = lcm, x, y;
ll gcd = exgcd(lcm, m[i], x, y);
ll mod = m[i] / gcd;
x = (x * lcm_a / gcd % mod + mod) % mod;
lcm = lcm / gcd * m[i], last_a = (last_a + k * x) % lcm;
}
return (last_a % lcm + lcm) % lcm;
}

#### 卢卡斯定理

typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 100;

void init() {
F[0] = 1;
for(int i = 2; i < maxn; i++)
F[i] = i * F[i - 1] % mod;
}

ll qpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
b >>= 1; a = a * a % mod;
}
return ans;
}

ll lucas(ll N, ll M) {
ll ans = 1;
while(N & M) {
ll n = N % mod, m = M % mod;
if(n < m) return 0;
ans = ans * F[a] % mod * qpow(F[m] * F[n - m] % mod, mod - 2) % mod;
N /= p; M /= p;
}
return ans;
}

#### 扩展卢卡斯定理

typedef long long ll;
const int N = 1e6 + 100;

ll n, m, p;

ll qpow(ll a, ll b, ll mod) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
b >>= 1; a = a * a % mod;
}
return ans;
}

ll fac(ll n, ll p, ll pk) {
if (!n) return 1;
ll ans = 1;
for (int i = 1; i < pk; i++)
if (i % p) ans = ans * i % pk;
ans = qpow(ans, n / pk, pk);
int npk = n % pk;
for (int i = 1; i <= npk; i++)
if (i % p) ans = ans * i % pk;
return ans * fac(n / p, p, pk) % pk;
}

ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
ll ans = exgcd(b, a % b, y, x);
y -= a / b * x;
return ans;
}

ll inv(ll a, ll p) {
return qpow(a, p - 2, p);
}

ll C(ll n, ll m, ll p, ll pk) {
if (n < m) return 0;
ll fn = fac(n, p, pk),
fm = fac(m, p, pk),
fn_m = fac(n - m, p, pk),
cnt = 0;
for (ll i = n; i; i /= p)
cnt += i / p;
for (ll i = m; i; i /= p)
cnt -= i / p;
for (ll i = n - m; i; i /= p)
cnt -= i / p;
return fn * inv(fm * fn_m % pk, pk) % pk * qpow(p, cnt, pk) % pk;
}

ll a[N], mod[N]; // a[]是通过卢卡斯分解出来的组合数值，m[]是对应的模数
int cnt; // 质因数的种数

ll CRT() {
ll M = 1, ans = 0;
for (int i = 0; i < cnt; i++)
M *= mod[i];
for (int i = 0; i < cnt; i++)
ans = (ans + a[i] * (M / mod[i]) % M * inv(M / mod[i], mod[i]) % M) % M;
return ans;
}

ll exlucas(ll n, ll m, ll p) {
ll sqrtp = sqrt(p + 0.5);
for (int i = 2; p > 1 && i <= sqrtp; i++) {
ll pk = 1;
while (p % i == 0)
p /= i, pk *= i;
if (pk > 1)
a[cnt] = C(n, m, i, pk), mod[cnt++] = pk;
}
if (p > 1)
a[cnt] = C(n, m, p, p), mod[cnt++] = p;
return CRT();
}

#### 题目

A题

Biorhythms HDU-1370

###### 思路

 1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cmath>
5 #include <cstring>
6 using namespace std;
7 typedef long long ll;
8 ll exgcd(ll a, ll b, ll &x, ll &y)
9 {
10     if(!b)
11     {
12         x = 1;
13         y = 0 * 100;
14         return a;
15     }
16     ll d = exgcd(b, a % b, x, y);
17     ll t = x;
18     x = y;
19     y = t - a / b * y;
20
21     return d;
22 }
23
24 ll inv(ll a,ll n)
25 {
26     ll y, d, x, fre, pf, qw;
27     /*cnt't*/
28     fre = pf = qw = 1;
29     fre++, pf++, qw++;
30     /*can't*/
31     d = exgcd(a,n,x,y);
32     return d == 1 ? (x + n) % n:-1;
33 }
34
35 ll CN(ll leo, ll *a, ll *m)
36 {
37     ll M = 1, ret = 0;
38     for(ll i = 0; i < leo; i ++)
39         M *= m[i];
40
41     for(ll i = 0; i < leo; i ++)
42     {
43         ll w = M / m[i];
44         ret = (ret + w * inv(w, m[i]) * a[i]) % M;
45     }
46     return (ret + M) % M;
47 }
48 int main()
49 {
50     ll t = 1, d;
51     ll a[10],m[10];
52     m[0] = 23;
53     m[1] = 28;
54     m[2] = 33;
55     /*GN*/
56     ll tea;
57     scanf("%lld", &tea);
58     while(true)
59     {
60         scanf("%lld%lld%lld%lld", &a[0], &a[1], &a[2], &d);
61
62         if(a[0] == -1 && a[1] == -1 && a[2] == -1 && d == -1)
63             break;
64         ll ans = CN(3, a, m);
65         if(ans <= d)
66             ans += 21252;
67         ans -= d;
68
69         printf("Case %lld: the next triple peak occurs in %lld days.\n", t, ans);
70         t++;
71     }
72     return 0;
73 }

B题

Big Coefficients HDU-3929

## CRT中国剩余定理 & Lucas卢卡斯定理的更多相关文章

1. [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告

题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...

2. HDU 5446 中国剩余定理+lucas

Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

3. 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理

[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...

4. 中国剩余定理&amp;Lucas定理&amp;按位与——hdu 5446

链接: hdu 5446 http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: 给你三个数$n, m, k$ 第二行是$k$个数,$p_1,p_2,p_ ... 5. hdu 5446 Unknown Treasure 中国剩余定理+lucas 题目链接 求C(n, m)%p的值, n, m<=1e18, p = p1*p2*...pk. pi是质数. 先求出C(n, m)%pi的值, 然后这就是一个同余的式子. 用中国剩余定理求解. ... 6. 51 Nod 1079 中国剩余定理（孙子定理）NOTE:互质情况 1079 中国剩余定理 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = 3.符合条件的最小的K = 23. 收起 ... 7. Lucas 卢卡斯定理 Lucas: 卢卡斯定理说白了只有一条性质 $$C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) ... 8. Lucas(卢卡斯)定理模板&amp;&amp;例题解析([SHOI2015]超能粒子炮&#183;改) Lucas定理 先上结论: 当p为素数: $$\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)$$ ... 9. Lucas卢卡斯定理 当p为素数时$$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$设$n=s*p+q,m\equiv t*p+r(q,r<=p)\$ 我 ...

## 随机推荐

1. PS通过滤色实现简单的图片拼合

素材如下: 素材一: 雪山 素材二: 月亮  效果: 实现步骤 1.在PS中打开雪山素材一 2.将月亮素材直接拖入雪山所在的图层中 3.锁定置入素材的高宽比(点击一下链状按钮) 4.调整月亮到合适大 ...

2. sql 用union合并合并查询结果

合并操作与连接相似,因为他们都是将两个表合并起来的另一个表的方法,然而他们的合并方法有本质的区别, 合并是两个表的相加,连接时时两个表的相乘: 01 在合并中两个表原列的数量与数据类型必须相同:在连接 ...

3. Effective C++ -----条款24：若所有参数皆需类型转换，请为此采用non-member函数

如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.

4. [问题2014A12] 复旦高等代数 I（14级）每周一题（第十四教学周）

[问题2014A12]  设 $$A,B$$ 是 $$n$$ 阶方阵且满足 $$AB=BA=0$$, $$\mathrm{r}(A)=\mathrm{r}(A^2)$$, 证明: \[\mathrm{ ...

5. 安卓虚拟机启动后报错： 类似 SDK Manager] Error: Error parsing .....devices.xml 解决方案

昨天用android sdk manager 更新了android sdk, 我是在eclipse上面安装adt来开发android的, 而且我每次打开虚拟机的时候也报错.报错的信息都是一样的.    ...

6. mysql innodb 引擎

innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...

7. YACC基本用法

YACC文件格式 yacc文件分为三部分: ... definitions ...(%{}%) %%... rules ...%% ... subroutines ...   定义部分 第一部分包括标 ...

8. python自动化Traceback (most recent call last):报错

今天使用python.然而遇见了Traceback (most recent call last):的报错.抓狂的一笔.有说path写错的,有说是...网上查到的资料也是很少.后来突然发现,页面上我暂 ...

9. 201521123079《java程序设计》第7周学习总结

1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boo ...

10. docker （2） 通用/镜像命令

Docker 的常用命令: (1)Docker  help 命令: 可以查看有关docker的所有操作命令: (2)docker COMMAND -–help 查看docker 的某项命令的帮助文档 ...