求\(C_n^m \mod p\),写得太丑了qwq。

第一次写拓展Lucas竟然是在胡策的时候qwq写了两个半小时啊_(:з」∠)_还写挂了一个地方qwq

当然今天胡策我也是第一次写中国剩余定理(ˇˍˇ)

↑平时懒得动手的后果→_→

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll; int ipow2(int a, int b) {
int ret = 1, w = a;
while (b) {
if (b & 1) ret = ret * w;
w = w * w;
b >>= 1;
}
return ret;
} int ipow(int a, int b, int c) {
int ret = 1, w = a;
while (b) {
if (b & 1) ret = 1ll * ret * w % c;
w = 1ll * w * w % c;
b >>= 1;
}
return ret;
} int pic; const int N = 100003; struct data {int num, zhi;}; data work(int n, int p, int c) {
if (n == 1 || n == 0) return (data) {1, 0};
int ret1, las = n % pic, ret2 = 1; for (int i = 1; i <= las; ++i) {
if (i % p == 0) continue;
ret2 = 1ll * ret2 * i % pic;
} if (n >= pic) {
ret1 = ret2;
for (int i = las + 1; i < pic; ++i) {
if (i % p == 0) continue;
ret1 = 1ll * ret1 * i % pic;
}
ret1 = ipow(ret1, n / pic, pic);
} else
ret1 = 1; int tim = n / p;
data s = work(n / p, p, c);
return (data) {1ll * ret1 * ret2 % pic * s.num % pic, tim + s.zhi};
} void exgcd(int a, int b, ll &x, ll &y) {
if (b == 0) {x = 1; y = 0;}
else {
exgcd(b, a % b, x, y);
ll t = x;
x = y;
y = t - a / b * y;
}
} int inv(int a, int b) {
ll x, y;
exgcd(a, b, x, y);
return (x % b + b) % b;
} int Lucas(int n, int m, int p, int c) {
data s1, s2, s3;
pic = ipow2(p, c);
s1 = work(n, p, c);
s2 = work(m, p, c);
s3 = work(n - m, p, c); int tim = s1.zhi - s2.zhi - s3.zhi;
int num1 = s1.num, num2 = s2.num, num3 = s3.num;
num2 = inv(num2, pic); num3 = inv(num3, pic);
num1 = 1ll * num1 * num2 % pic * num3 % pic;
for (int i = 1; i <= tim; ++i)
num1 = 1ll * num1 * p % pic;
return num1;
} int prime[N], cnt = 0, cc[N], pc[N]; void Div(int p) {
int sq = ceil(sqrt(p));
for (int i = 2; i <= sq; ++i) {
if (p % i == 0) {
prime[++cnt] = i;
pc[cnt] = 1;
cc[cnt] = 0;
while (p % i == 0) {++cc[cnt]; p /= i; pc[cnt] *= i;}
}
}
if (p > 1) prime[++cnt] = p, cc[cnt] = 1, pc[cnt] = p;
} int n, m, k, p, x;
int num[N]; int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d%d%d", &n, &m, &k, &p); cnt = 0;
Div(p); for (int i = 1; i <= cnt; ++i)
num[i] = Lucas(n, m, prime[i], cc[i]); x = 0;
for (int i = 1; i <= cnt; ++i)
(x += (1ll * (p / pc[i]) * inv((p / pc[i]) % pc[i], pc[i]) % p * num[i] % p)) %= p;
printf("%d\n", x);
} return 0;
}

【拓展Lucas】模板的更多相关文章

  1. 拓展lucas结论及模板

    lucas及其拓展 模板题 洛谷 P4720 本文侧向结论和代码实现, 推导请转至lucas定理及其拓展的推导 https://blog.csdn.net/yuyilahanbao/article/d ...

  2. BZOJ 3129 [SDOI2013]方程 (拓展Lucas)

    题目大意:给定一个方程$X_{1}+X_{2}+X_{3}+X_{4}+...+X_{n}=M$,$\forall X_{i}<=A_{i} (i<=n1)$ $\forall X_{i} ...

  3. 数学:拓展Lucas定理

    拓展Lucas定理解决大组合数取模并且模数为任意数的情况 大概的思路是把模数用唯一分解定理拆开之后然后去做 然后要解决的一个子问题是求模质数的k次方 将分母部分转化成逆元再去做就好了 这里贴一份别人的 ...

  4. 【bzoj2142】【礼物】拓展Lucas定理+孙子定理

    (上不了p站我要死了,侵权度娘背锅) Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量 ...

  5. nefu 84 ( 拓展欧几里德模板题 )

    链接:传送门 思路:拓展欧几里德模板题,设大圣至少翻转 t 次,大圣起始位置为 x ,大圣目标位置为 y + n * s ( 大圣到达目标位置 y 可能需要多圈,所以用 s 来表示圈数 ),因为只能逆 ...

  6. 拓展Lucas小结

    拓展Lucas是解决大组合数取模非质数(尤其是含平方因子的合数)问题的有力工具... 首先对模数质因数分解,把每个质因子单独拎出来处理答案,然后用中国剩余定理(excrt)合并 问题转化为,对于每个质 ...

  7. BZOJ2142: 礼物(拓展lucas)

    Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...

  8. BZOJ2982: combination Lucas模板

    2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 734  Solved: 437[Submit][Status][Di ...

  9. 【BZOJ-2142】礼物 拓展Lucas定理

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1313  Solved: 541[Submit][Status][Discuss] ...

随机推荐

  1. 【bzoj3387-跨栏训练】线段树+dp

    我们可以想到一个dp方程:f[i][0]表示当前在i个栅栏的左端点,f[i][1]表示在右端点. 分两种情况: 第一种:假设现在要更新线段gh的左端点g,而它下来的路径被ef挡住了,那么必定是有ef来 ...

  2. 【Foreign】数据结构C [线段树]

    数据结构C Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input Sample Output H ...

  3. John's trip(POJ1041+欧拉回路+打印路径)

    题目链接:http://poj.org/problem?id=1041 题目: 题意:给你n条街道,m个路口,每次输入以0 0结束,给你的u v t分别表示路口u和v由t这条街道连接,要输出从起点出发 ...

  4. Select 使用不当引发的core,你应该知道的

    排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...

  5. 真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】

    转自:http://blog.csdn.net/kasalyn/article/details/11473885 static inline void raw_spin_lock(raw_spinlo ...

  6. 阿波罗11号登月飞船电脑控制系统源码(AGC)

    阿波罗11号登月飞船电脑控制系统源码(AGC) http://download.csdn.net/detail/downiis6/9574926 down url: https://github.co ...

  7. tomcat远程调试参数备忘

    tomcat远程调试,启动时添加参数: -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,ser ...

  8. NFS+inotify实时同步

    Inotify简介 Inotify是一种文件系统事件通告机制,能够实时监控文件系统下文件的访问.修改.删除等各种变化情况并将其作为事件通告给用户态应用程序.Linux内核从2.6.13版本后已经集成了 ...

  9. angularjs 微信授权登录 微信支付

    最近做一个项目,用angular 一个单页应用,打算打包成 跨平台移动App 以及在微信里面使用.给大家一个案例 首先,熟悉一下微信授权部分的源代码,如下所示: javascript 前端代码: va ...

  10. angularJS的MVC的用法

    1.前端MVC: M:Model,数据库 V:HTML页面 C:Control控制器 比较很有名的前端MVC框架:ExtJs 2.angularJS的MVC框架搭建 index.html代码如下: & ...