BZOJ 3656: 异或 (组合数取模 CRT)
http://www.lydsy.com/JudgeOnline/problem.php?id=3656
大意:经过一通推导,问题变成求$$\binom N M \mod P$$,其中N,M<=1e9, P<=1e5,P可以是合数。
参考这位神犇的博客:http://blog.csdn.net/braketbn/article/details/50752153
作为一个蒟蒻,稍微写一点自己的理解...
如果P是素数,我们可以用lucas定理直接解决,那么P是合数应该怎么办呢?
首先,考虑把P分解质因数,拆成$${p_0} ^ {k_0} {p_1}^{k_1} {p_2} ^ {k_2}...$$的形式,再对每一个p^k计算,最后用CRT(中国剩余定理)合并。
然后就是怎么算组合数对质数的幂取模的问题了。我们设$$f(n)=\prod_{i=1}^n i[i\mod p\ne0]\mod {pk}$$,就是1~n中非p的倍数的积对pk取模,那么只要先把n!,m!,(n-m)!里的p的倍数的因子p全部提出来,然后求出f(n),f(m),f(n-m)的值就行了。
求f(n)可以用递归,把n按照p^k分段,整段的可以一起算,零散的一段直接暴力计算,然后乘上f(n/p),表示所有的p的倍数除以p后f的值。总的时间复杂度$$O(P log N)$$。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define TR(x) printf(#x"=%d\n", x)
const int MAXN=100005;
int f[MAXN];
int p[15], k[15], pk[15], s[15], phi[15], np;
int mpow(int a,int b,int m){int r=1;for(;b;b>>=1,a=(ll)a*a%m)if(b&1)r=(ll)r*a%m;return r;}
int calc(int n, int x){
if(!n) return 1;
int q=pk[x], t=n/q, r=1;
if(t){
for(int i=1; i<q; ++i) if(i%p[x]) r=(ll)r*i%q;
r=mpow(r,t,q);
}
for(int i=n%q; i>=1; --i) if(i%p[x]) r=(ll)r*i%q;
return (ll)r*calc(n/p[x], x)%pk[x];
}
int cntp(int n, int p){
int r=0;
while(n) r+=(n/=p);
return r;
}
int main(){
int n, m, P, ans=0;
scanf("%d%d%d", &n, &m, &P);
for(int i=2, tp=P; i<=tp; ++i) if(tp%i==0){
p[np]=i; pk[np]=1;
while(tp%i==0) tp/=i, k[np]++, pk[np]*=i;
phi[np]=pk[np]/i*(i-1); np++;
}
for(int i=0; i<np; ++i){
int t=cntp(n,p[i])-cntp(m,p[i])-cntp(n-m,p[i]);
s[i]=mpow(p[i],t,pk[i]);
s[i]=(ll)s[i]*calc(n,i)%pk[i];
s[i]=(ll)s[i]*mpow(calc(m,i),phi[i]-1,pk[i])%pk[i];
s[i]=(ll)s[i]*mpow(calc(n-m,i),phi[i]-1,pk[i])%pk[i];
}
for(int i=0; i<np; ++i){
ans=(ans+(ll)s[i]*(P/pk[i])%P*mpow(P/pk[i],phi[i]-1,pk[i])%P)%P;
}
printf("%d\n", ans);
return 0;
}
BZOJ 3656: 异或 (组合数取模 CRT)的更多相关文章
- BZOJ_2142_礼物_扩展lucas+组合数取模+CRT
BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...
- [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】
题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...
- 组合数取模(lucas定理+CRT合并)(AC)
#include<bits/stdc++.h> #define re register #define int long long using namespace std; ; inlin ...
- 组合数取模Lucas定理及快速幂取模
组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1) , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...
- 排列组合+组合数取模 HDU 5894
// 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...
- hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)
DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...
- lucas定理解决大组合数取模
LL MyPow(LL a, LL b) { LL ret = ; while (b) { ) ret = ret * a % MOD; a = a * a % MOD; b >>= ; ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok’s formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 组合数取模&&Lucas定理题集
题集链接: https://cn.vjudge.net/contest/231988 解题之前请先了解组合数取模和Lucas定理 A : FZU-2020 输出组合数C(n, m) mod p (1 ...
随机推荐
- BZOJ4771 七彩树(dfs序+树上差分+主席树)
考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...
- Oracle 获取数据最新版本
表数据如: 以CODE 作为版本分组字段,对创建时间进行按最新排序 ID NAME CODE CREATE_TIME 1ffg abc 001 2014-01-01 1gff ...
- BZOJ3173:[TJOI2013]最长上升子序列 & HDU3564:Another LIS——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 http://acm.hdu.edu.cn/showproblem.php?pid=3564 ...
- BZOJ1293:[SCOI2009]生日礼物——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1293 https://www.luogu.org/problemnew/show/P2564#sub ...
- HDU5446:Unknown Treasure——题解
http://acm.hdu.edu.cn/showproblem.php?pid=5446 求C(n,m)%(p1p2…pk)的值,其中pi均为质数. 参考:https://www.cnblogs. ...
- 51nod 1217 Minimum Modular(数论+暴力)
根据抽屉原理显然m>=(n-K) 于是在[n-K,max(a1..an)+1]的范围中枚举m 考虑K=0的做法... 如果a[i]≡a[j](mod m),则有m|(a[i]-a[j]),只要O ...
- Linux内核中的常用宏container_of其实很简单
http://blog.csdn.net/npy_lp/article/details/7010752 通过一个结构体变量的地址,求该结构体的首地址. #ifndef CONTAINER_OF #de ...
- 使用snmp4j实现Snmp功能(一)
相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 上一篇文章讲了Snmp的一些基本概念(Snmp学习笔记), ...
- POJ3690:Constellations(二维哈希)
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6822 Accepted: 1382 题目 ...
- dubbo在项目中的应用
关于dubbo的使用,我们举个简单例子: 存在2个系统,A系统和B系统,A系统调用B系统的接口获取数据,用于查询用户列表. 在上一篇博文介绍了dubbo的创建,zookeeper的创建完成后,我们可以 ...