求\(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. bzoj 4034: [HAOI2015]树上操作——树链剖分

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  2. 【洛谷 P3187】 [HNOI2007]最小矩形覆盖 (二维凸包,旋转卡壳)

    题目链接 嗯,毒瘤题. 首先有一个结论,就是最小矩形一定有条边和凸包重合.脑补一下就好了. 然后枚举凸包的边,用旋转卡壳维护上顶点.左端点.右端点就好了. 上顶点用叉积,叉积越大三角形面积越大,对应的 ...

  3. js 重置表单

    //方法一document.getElementById("myform").reset(); //方法二 ].reset(); //方法三 使用input按钮 <input ...

  4. Tomcat8配置默认项目

    <!-- 配置默认访问项目 --> <Host name="localhost" appBase="webapps" unpackWARs=& ...

  5. shellcheck 帮助你写出更好的脚本

    简介 shellcheck 是一款实用的 shell脚本静态检查工具. 首先,可以帮助你提前发现并修复简单的语法错误,节约时间.每次都需要运行才发现写错了一个小地方,确实非常浪费时间. 其次,可以针对 ...

  6. 网络知识===《图解TCP/IP》学习笔记——网络的构成要素

    首先引入网络构成要素图 图片来自<图解TCP/IP--P37> 1.通信媒介与数据链路 计算机之间通过电缆相互连接,电缆可以分为多种,包括双绞线电缆,光纤电缆,同轴电缆,串行电缆等. 图片 ...

  7. H5对安卓WeView开发中的影响

     1.body,或者html 高度为100% 会导致下拉直接触发原生的刷新控件,而不是webView滑动到顶部后刷新,以及不会执行onScrollChanged 方法,并且getScrollY 总是返 ...

  8. lnmp的安装--mysql

    1.前期准备 创建组:groupadd mysql 创建用户:useradd -r -g mysql mysql 创建mysql文件夹于数据存放文件夹data mkdir -p /usr/www/my ...

  9. java的关键字final

    final可以修饰类,成员方法,成员变量. 1.final修饰的类不能被继承,所以没有子类 final class First{ int num; } class Second extends Fir ...

  10. springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置

    web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...