求C(p,q)%MOD(主要处理n!%MOD的求法)

#define ll long long
#define maxn 1000010
#define MOD 1000000007
ll f[maxn],ny[maxn];
ll inv(ll a,ll m){
	ll p=1,q=0,b=m,c,d;
	while(b>0){
		c=a/b;
		d=a; a=b; b=d%b;
		d=p; p=q; q=d-c*q;
	}
	return p<0?p+m:p;
}
void init(){
	f[0]=1;
	ny[0]=inv(f[0],MOD);
	for(int i=1;i<maxn;++i){
		f[i]=f[i-1]*i%MOD;
		ny[i]=inv(f[i],MOD);
	}
}
ll C(ll a,ll b){
	if(b<0 || a<0 || a<b) return 0;
	return f[a]*ny[b]%MOD*ny[a-b]%MOD;
}
ll ans=C(p,q);

时间: 2024-10-10 04:19:52

求C(p,q)%MOD(主要处理n!%MOD的求法)的相关文章

O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1,t=i*p[1]; while(j<=p[0] && t<=r) { no[t]=true; if(i%p[j]==0) //每一个数字都有最小质因子.这里往后的数都会被筛过的,break break; t=i*p[++j]; } } } O(n)筛欧拉函数 void find()

n对mod求模整除时转化成mod的数学式

n对mod求模,它的值在0到mod-1之间,如果要求模整除的时候转化成mod可以用下面的式子: n = (n - 1 % mod + mod) % mod +1 这里先减一,模上mod再加一,这样如果是整除mod的话先减一模上之后就变成mod-1,最后+1就变成mod了 这里模mod的方法是先模mod再加mod再模mod,这是常用的做法,目的是为了使得模的结过为正数,而不是负数. 原文地址:https://www.cnblogs.com/fzl194/p/9027068.html

The Evaluation of Determinant(求行列式mod一个数的值)

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #define LL long long using namespace std; LL n,m,A[105][105],p[10000],pos,d[105],r[105],len,B[105][105]; bool vd[10005]={0}; void prim

(快速幂) 求(A1B1+A2B2+ ... +AHBH)mod M

Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing research shows, that

初等变换求 |A| % Mod &amp; A- % Mod &amp; A* % Mod(模板)

1 // |A| * A- = A* (伴随矩阵) = 逆矩阵 * 矩阵的值 2 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<ctime> 8 #include<iostream> 9 #include<algorithm> 10 using namespace std; 11 12 cons

求a^b的约数对mod取模

const int maxn=30000+5; int prime[maxn]; void marktable(int n){ memset(prime,0,sizeof(prime)); for(int i=2;i<=n;i++){ if(!prime[i]) prime[++prime[0]]=i; for(int j=1;j<=prime[0]&&prime[j]<=n/i;j++){ prime[prime[j]*i]=1; if(i%prime[j]==0) b

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

蔡勒公式求今天是星期几?

之所以知道蔡勒公式,是因为今天在九度上做的一道题目[题目1043:Day of Week].以前也曾经做过求星期几这样的题目,当时的做法比较粗暴:已经知道某年某月某日是星期几,要求现在给的某天是星期几,直接求给的日期和已知日期的相差天数对7取余,再根据已知的星期做相应的调整即可.这样的做法不仅繁琐,而且一不留神就有可能算错.这次又碰到类似的题目,希望尝试新的方法.于是在查资料的过程中,知道了蔡勒公式.于是用蔡勒公式来解决了这道题目,虽然知道蔡勒公式,但是在使用过程中依旧错误不断.其实是因为对蔡勒

BZOJ 4018 小Q的幻想之乡

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=4018 题意: T组询问,每组询问给定N和M,求∑Ni=1∑Mj=1|i?j|gcd(i,j)分别模109+7和109+9的值. T≤1000,N,M≤2?106. 题解: 考虑将∑Ni=1∑Mj=1|i?j|gcd(i,j)化简. 首先引入一个记号,令[x]表示:若x为真,则[x]为1:否则[x]为0,其中x是一个布尔表达式. ∑i=1N∑j=1M|i?j|gcd(i,j)=∑i=1N∑j=