模板—数学—Lucas

模板—数学—Lucas

Code:

#include <cstdio>
#include <algorithm>
using namespace std;
#define N 100010
int n,m,p,inv[N],powq[N];
int lucas(int n,int m)
{
	if(n<m) return 0;
	if(n<=p&&m<=p) return 1ll*powq[n]*inv[m]%p*inv[n-m]%p;
	return 1ll*lucas(n/p,m/p)*lucas(n%p,m%p)%p;
}
int main()
{
	int T;scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&p),n+=m; powq[0]=1,inv[p-1]=p-1;
		for(int i=1;i<=p;i++) powq[i]=1ll*powq[i-1]*i%p;
		for(int i=p-2;~i;i--) inv[i]=1ll*inv[i+1]*(i+1)%p;
		printf("%d\n",lucas(n,m));
	}
}

  

原文地址:https://www.cnblogs.com/yangsongyi/p/10658163.html

时间: 2024-11-05 17:28:14

模板—数学—Lucas的相关文章

【学习总结】数学-lucas定理

定义: 数论Lucas定理是用来求 C(mn)%p的值, p是素数. 描述: lucas(n,m,p)=lucas(n/p,m/p,p)?C(m%pn%p) lucas(n,0,p)=1 证明: 设p为素数,A,B为正整数,并且有(即A,B的p进制情况): A=akpk+ak?1pk?1+-+a1p1+a0 B=bkpk+bk?1pk?1+-+b1p1+b0 因为C(jp)=C(j?1p?1)?pj=0 (含有因子p) 所以(1+x)t(modp)=(1+xt)(modp) (中间展开项均含有C

模板—数学—矩阵树定理

模板—数学—矩阵树定理 Code: #include <cstdio> #include <algorithm> using namespace std; #define N 1010 #define mod 1000000000 long long ans,squ[N][N];int n,m; long long calc(int n) { long long tmp=1; for(int i=1;i<n;i++) { int j; for(j=i;j<n;j++)

[SinGuLaRiTy] 复习模板-数学

[SinGuLaRiTy-1047] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 质因数分解 void solve(int n) { while(n%2==0) { printf("%d*",2); n/=2; } for(int i=3;i<=sqrt(n);i+=2) { if(n%i==0) { n/=i; printf("%d*",i); i-=2; } } printf("%d\

模板 - 数学 - 组合数

线性预处理组合数,一般来说只是需要用一个组合数,当MOD大于n和m的时候可以这样求,否则应该用扩展Lucas定理. const ll MOD = 1e9 + 7; const int MAXN = 1e6; ll inv[MAXN + 5], fac[MAXN + 5], invfac[MAXN + 5]; void init_C(int n) { inv[1] = 1; for(int i = 2; i <= n; i++) inv[i] = inv[MOD % i] * (MOD - MOD

大组合数取余模板【Lucas定理】

求C(n, m) % mod 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <bits/stdc++.h> using namespace std; long long fact[200200]; long long inv[200200]; const int mod = 1e9 + 7; long 

[模板] 数学

数论 exgcd 用途 解不定方程 $ ax+by = c $ 代码 ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0){x=1,y=0;return a;} ll tmp=exgcd(b,a%b,y,x); y-=a/b*x; return tmp; } int main(){ ll a,b,c; ll m,x,y; m=exgcd(a,b,x,y); if(c%m!=0)cout<<"No\n"; //无解 else{ c

模板 - 数学 - 博弈论

1.要从必胜或必败的局面反推 2.SG函数 只要当前状态可以转移到的状态中有一个是败态,那么当前状态就是胜态.胜态为N. 如果当前状态可以转移到的所有状态都是胜态,那么当前状态就是败态.败态为P. sg函数为每个状态赋一个自然数的值,这个值为除这个状态的后继外的最小自然数.首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3.mex{2,3,5}=0.mex{}=0. 从图的汇点开始反推,可知汇点

模板 - 数学 - 数论 - 莫比乌斯反演 - 2

示例: 1.经典问题 求 $f(x,n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==x]$ : 答案: $f(x,n,m) = \sum\limits_{k=1}\mu(k){\lfloor{\frac{n}{kx}}}\rfloor{\lfloor{\frac{m}{kx}}\rfloor}$ 构造: $F(x,n,m) = \sum\limits_{x|d}f(d) = \sum\limits_{k=1}f(kx) =\su

模板 - 数学 - 同余 - 扩展Euler定理

费马(Fermat)小定理 当 \(p\) 为质数,则 \(a^{p-1}\equiv 1 \mod p\) 反之,费马小定理的逆定理不成立,这样的数叫做伪质数,最小的伪质数是341. 欧拉(Euler)定理 扩展欧拉(Euler)定理 根据扩展欧拉定理,不管a和p是不是互质,都可以缩小到 \([\varphi(p),2\varphi(p)]\) 之间,然后暴力用快速幂求解. 原文地址:https://www.cnblogs.com/KisekiPurin2019/p/11956991.html