首页 > 其他分享 >Luogu P4720 【模板】扩展卢卡斯定理/exLucas

Luogu P4720 【模板】扩展卢卡斯定理/exLucas

时间:2023-06-23 10:44:25浏览次数:43  
标签:return Luogu ll 样例 tot pk exLucas P4720 mod

【模板】扩展卢卡斯定理/exLucas

题目背景

这是一道模板题。

题目描述

\[{\mathrm{C}}_n^m \bmod{p} \]

其中 \(\mathrm{C}\) 为组合数。

输入格式

一行三个整数 \(n,m,p\) ,含义由题所述。

输出格式

一行一个整数,表示答案。

样例 #1

样例输入 #1

5 3 3

样例输出 #1

1

样例 #2

样例输入 #2

666 233 123456

样例输出 #2

61728

提示

对于 \(100 \%\) 的数据,\(1 \le m \le n \le {10}^{18}\),\(2 \le p \le {10}^6\),不保证 \(p\) 是质数。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>

typedef long long ll;

using namespace std;

ll n, m, sum, p;
ll a[5211314];

class Exlucas{
	long long c[5211314], r[5211314], d[5211314], tot;
	private:
		inline ll QuickPower(ll a, ll k, ll mod) {
			ll ans = 1, base = a;
			while (k != 0) {
				if (k & 1 == 1) {
					ans = ans * base % mod;
				}
				base = base * base % mod;
				k >>= 1;
			}
			return ans;
		}
		inline ll Exgcd(ll a, ll b, ll &x, ll &y) {
			if (b == 0) {
				x = 1, y = 0;
				return a;
			}
			ll x1, y1, gcd;
			gcd = Exgcd(b, a % b, x1, y1);
			x = y1;
			y = x1 - a / b * y1;
			return gcd;
		}
		inline ll Inv(ll a, ll mod) {
			ll x = 0, y = 0;
			Exgcd(a, mod, x, y);
			return (x % mod + mod) % mod;
		}
		inline ll Fac(ll n, ll p, ll pk) {
			if (n == 0) return 1;
			ll ans = 1;
			for (ll i = 1; i <= pk; ++ i) {
				if (i % p != 0) {
					ans = ans * i % pk;
				}
			}
			ans = QuickPower(ans, n / pk, pk);
			for (ll i = 1; i <= n % pk; ++ i) {
				if (i % p != 0) {
					ans = ans * i % pk;
				}
			}
			return ans * Fac(n / p, p, pk) % pk;
		}
		inline ll GetC(ll n, ll m, ll p, ll pk) {
			if (n < m) return 0;
			ll x = Fac(n, p, pk), y = Fac(m, p, pk), z = Fac(n - m, p, pk);
			ll k = n - m, cnt = 0;
			while (n != 0) n /= p, cnt += n;
			while (m != 0) m /= p, cnt -= m;
			while (k != 0) k /= p, cnt -= k;
			return x * Inv(y, pk) % pk * Inv(z, pk) % pk * QuickPower(p, cnt, pk) % pk;
		}
		inline ll CRT() {
			ll M = 1, ans = 0;
			for (ll i = 1; i <= tot; ++ i) {
				M *= c[i];
			}
			for (ll i = 1; i <= tot; ++ i) {
				d[i] = M / c[i];
			}
			for (ll i = 1; i <= tot; ++ i) {
				ans = (ans + r[i] * d[i] % M * Inv(d[i], c[i]) % M )% M;
			}
			return (ans % M + M) % M;
		}
	public:
		inline ll exlucas(ll n, ll m, ll p) {
			tot = 0;
			ll tmp = sqrt(p);
			for (ll i = 2; i <= tmp && p >= 1; ++ i) {
				ll pk = 1;
				while (p % i == 0) {
					p /= i, pk *= i;
				}
				if (pk > 1) {
					tot ++;
					c[tot] = pk;
					r[tot] = GetC(n, m, i, pk);
				}
			}
			if (p > 1) {
				tot ++;
				c[tot] = p;
				r[tot] = GetC(n, m, p, p);
			}
			cout << CRT() << endl;
			return CRT();
		}
}ask; 

int main() {
	cin >> n >> m >> p;
	ask.exlucas(n, m, p);
	return 0;
}

标签:return,Luogu,ll,样例,tot,pk,exLucas,P4720,mod
From: https://www.cnblogs.com/jueqingfeng/p/17498811.html

相关文章

  • Luogu3168 [CQOI2015] 任务查询系统 - 主席树 - 二分 -
    题目链接:https://www.luogu.com.cn/problem/P3168题解:主席树可以解决一类j静态区间第\(k\)小的问题,我们先来看看这是怎么工作的主席树的本质就是有很多棵线段树,然后发现这些线段树绝大多数都是重叠的,因此可以优化到空间复杂度\(O(n\logn)\)在这里,我们将序列的每一个位置......
  • [刷题笔记] Luogu P1379 八数码
    ProblemSolution题意非常明确,显然搜索,搜索的时候存储八数码可以用二维或者一维,但是个人感觉用二维更明了一些。需要注意去重,去重可以用set维护一下已经搜过的八数码,如果手写去重小心MLE具体实现的时候注意一下细节。Code#include<iostream>#include<cstdio>#include<al......
  • luogu P1963 [NOI2009] 变换序列
    luoguP1963[NOI2009]变换序列题意对于\(N\)个整数\(0,1,\cdots,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i\in\{0,1,\cdots,N-1\}\)且\(\bigcup_{i=0}^{N-1}\{T_i\}=\{0,1,\cdots,N-1\}\)。,\(\forallx,y\in\{0,1,\cdots,N-1\......
  • Luogu3792 由乃与大母神原型和偶像崇拜 - 线段树 - set -
    题目链接:https://www.luogu.com.cn/problem/P3792题解:一点小小的空间震撼(ML:125MB)首先询问可以转化成:区间\([l,r]\)的\(max-min+1=r-l+1\)并且区间内没有重复元素。可以考虑对每个点\(i\)记一个前驱结点\(pr_i\),表示\(a_{pr_i}=a_i\),且\(pr_i\)是\(i\)前面离\(i\)......
  • Luogu P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有\(16\)头母猪,如果建了\(3\)个猪圈,剩下......
  • luogu P7740 [NOI2021] 机器人游戏
    题面传送门一个bitset值52分?首先样例让你容斥你就容斥,枚举哪些位是可以的,计算每一位的\(p_0,p_1,q_0,q_1\)表示是否被要求最后是\(0/1\),是否有最终值是开始值异或\(0/1\)。然后每个位置的贡献可以分类讨论出来:如果\(p_0,p_1\)或者\(q_0,q_1\)都有,那只能空着。如......
  • Luogu P7118
    题面题意很清楚,就不复述了。不难发现,我们首先要求出场景数小于给定galgame的galgame数量,于是我们需要求出场景数\(=i\)的galgame数量,设为\(f_i\)。考虑根节点,当A场景大小为\(j\)时,B场景的大小为\(i-j-1\)。枚举每个\(j\),不难得到\(f_i=\sum\limits_{j=0}^{i-1......
  • Luogu P2580 于是他错误的点名开始了
    于是他错误的点名开始了题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点......
  • Luogu P3435 [POI2006] OKR-Periods of Words
    [POI2006]OKR-PeriodsofWords题面翻译对于一个仅含小写字母的字符串\(a\),\(p\)为\(a\)的前缀且\(p\nea\),那么我们称\(p\)为\(a\)的proper前缀。规定字符串\(Q\)(可以是空串)表示\(a\)的周期,当且仅当\(Q\)是\(a\)的proper前缀且\(a\)是\(Q+Q\)的前缀......
  • Luogu P2375 [NOI2014] 动物园
    [NOI2014]动物园题目描述近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。某天,园长给动物们讲解KMP算法。园长:“对于一个字符串\(S\),它......