BZOJ 2982 combination Lucas定理

题目大意:求C(n,m)%p。

思路:Lucas定理:C(n,m)%p = C(n/p,m/p)*C(n%p,m%p)%p

处理出来1~10007所有的阶乘和阶乘的逆元,nm都小于10007的时候就可以直接算了,剩下的情况递归处理。

CODE:

#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 11000
#define p 10007
using namespace std;

int inv[MAX],fac[MAX];

void Shaker()
{
	inv[1] = 1;
	for(int i = 2; i < MAX; ++i)
		inv[i] = (p - p / i) * inv[p % i] % p;
	fac[0] = 1;
	for(int i = 1; i < MAX; ++i)
		fac[i] = fac[i - 1] * i % p;
	inv[0] = 1;
	for(int i = 1; i < MAX; ++i)
		inv[i] = inv[i - 1] * inv[i] % p;
}

int C(int n,int m)
{
	if(n < m)	return 0;
	if(n < p && m < p)
		return fac[n] * inv[m] % p * inv[n - m] % p;
	return C(n / p,m / p) * C(n % p,m % p) % p;
}

int x,y,cases;

int main()
{
	Shaker();
	for(cin >> cases; cases--;) {
		scanf("%d%d",&x,&y);
		printf("%d\n",C(x,y));
	}
	return 0;
}

时间: 2024-10-18 04:41:54

BZOJ 2982 combination Lucas定理的相关文章

BZOJ 2982: combination( lucas )

lucas裸题. C(m,n) = C(m/p,n/p)*C(m%p,n%p). ----------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MOD = 10007; int Inv

bzoj2982: combination(lucas定理板子)

2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 664  Solved: 397[Submit][Status][Discuss] Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值.(1<=m<=n<=200,000,000) Inpu

bzoj——2982: combination

2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 611  Solved: 368[Submit][Status][Discuss] Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值.(1<=m<=n<=200,000,000) Inpu

【BZOJ2982】combination Lucas定理

[BZOJ2982]combination Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值.(1<=m<=n<=200,000,000) Input   第一行一个整数t,表示有t组数据.(t<=200)   接下来t行每行两个整数n, m,如题意. Output T行,每行一个数,为C(n, m) mod

BZOJ 2982 combination

Lucas定理模板题目 #include <iostream> #include <string.h> #include <cmath> #define ll long long using namespace std; const int maxn=10000007; ll n,m,p; ll fac[maxn];   void getfac(ll p)//预处理阶层 {     fac[0]=1;     for(int i=1;i<=p;i++)      

[BZOJ2982]combination Lucas定理

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2982 $C(N,M)\% P = C(N\% P,M\% P) * C(N/P,M/P)\% P$ 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mod=1e4+7; 6 int inv[10010],fac[1001

【BZOJ 2982】 2982: combination (卢卡斯定理)

2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 510  Solved: 316 Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值.(1<=m<=n<=200,000,000) Input   第一行一个整数t,表示有t组数据.(t&l

BZOJ 4403 2982 Lucas定理模板

思路: Lucas定理的模板题.. 4403 //By SiriusRen #include <cstdio> using namespace std; const int mod=1000003; #define int long long int cases,N,L,R,fac[mod],inv[mod]; int C(int n,int m){ if(n<m)return 0; if(n<mod&&m<mod)return fac[n]*inv[n-m]

组合数学lucas定理 BZOJ2982 combination

2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 597  Solved: 357[Submit][Status][Discuss] Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值.(1<=m<=n<=200,000,000) Inpu