【BZOJ3782】上学路线 组合数+容斥+CRT

【BZOJ3782】上学路线

Description

小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M)。小C家住在西南角,学校在东北角。现在有T个路口进行施工,小C不能通过这些路口。小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走;而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条。由于答案可能很大,所以小C只需要让你求出路径数mod P的值。

Input

第一行,四个整数N、M、T、P。

接下来的T行,每行两个整数,表示施工的路口的坐标。

Output

一行,一个整数,路径数mod P的值。

Sample Input

3 4 3 1019663265
3 0
1 1
2 2

Sample Output

8

HINT

1<=N,M<=10^10

0<=T<=200

p=1000003或p=1019663265

题解:从(0,0)走到(n,m)的总方案数=C(n+m,n)。

依旧考虑容斥,先将点排序,用f[i]表示从(0,0)走到(x[i],y[i]),途中不经过其它障碍的方案数,那么如果j在i的左下方,则f[i]-=f[j]*(从j走到i的方案数)。

然而1019663265不是质数?分解质因数的1019663265=3*5*6793*10007,分别求解,再用中国剩余定理合并即可。

EXGCD还能写错~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll mod,ans;
ll n,m,P;
int T;
ll f[210],jc[1000010],jcc[1000010],ine[1000010];
struct node
{
	ll x,y;
}p[210];
bool cmp(node a,node b)
{
	return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
ll C(ll a,ll b)
{
	if(a<b)	return 0;
	if(!b)	return 1;
	if(a<mod&&b<mod)	return jc[a]*jcc[a-b]%mod*jcc[b]%mod;
	return C(a%mod,b%mod)*C(a/mod,b/mod)%mod;
}
ll calc()
{
	memset(f,0,sizeof(f));
	int i,j;
	jc[0]=jcc[0]=1;
	ine[1]=1;
	for(i=2;i<mod;i++)	ine[i]=(mod-(mod/i)*ine[mod%i]%mod)%mod;
	for(i=1;i<mod;i++)	jc[i]=jc[i-1]*i%mod,jcc[i]=jcc[i-1]*ine[i]%mod;
	for(i=1;i<=T;i++)
	{
		f[i]=C(p[i].x+p[i].y,p[i].x);
		for(j=1;j<i;j++)
			if(p[i].x>=p[j].x&&p[i].y>=p[j].y)	f[i]=(f[i]-f[j]*C(p[i].x-p[j].x+p[i].y-p[j].y,p[i].x-p[j].x)%mod+mod)%mod;
	}
	return f[T];
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b)
	{
		x=1,y=0;
		return ;
	}
	exgcd(b,a%b,x,y);
	ll tmp=x;
	x=y,y=tmp-a/b*x;
}
ll work(ll a,ll c,ll b)
{
	ll x,y;
	exgcd(a,b,x,y),x=(x+b)%b;
	return x*a%P*c%P;
}
int main()
{
	scanf("%lld%lld%d%lld",&n,&m,&T,&P);
	int i;
	for(i=1;i<=T;i++)	scanf("%lld%lld",&p[i].x,&p[i].y);
	p[++T].x=n,p[T].y=m;
	sort(p+1,p+T+1,cmp);
	if(P==1000003)
	{
		mod=P,printf("%lld",calc());
		return 0;
	}
	ll a1,a2,a3,a4;
	mod=3,a1=calc();
	mod=5,a2=calc();
	mod=6793,a3=calc();
	mod=10007,a4=calc();
	ans=(ans+work(P/3,a1,3))%P;
	ans=(ans+work(P/5,a2,5))%P;
	ans=(ans+work(P/6793,a3,6793))%P;
	ans=(ans+work(P/10007,a4,10007))%P;
	printf("%lld",(ans+P)%P);
	return 0;
}//3 4 3 1000003 3 0 1 1 2 2
时间: 2024-08-01 07:16:28

【BZOJ3782】上学路线 组合数+容斥+CRT的相关文章

【题解】分特产(组合数+容斥)

[题解]分特产(组合数+容斥) 一道小水题. 假如没有这个要求每个人都要有一个特产的限制我们直接可以组合数. 我们又发现人(本质上)是没有区别的,所以容斥的复杂度只有\(O(n)\) \(n\)个人分\(m\)个特产,每个特产有\(a_i\)个,人可以不拿特产,的方案数就是把\(a_i\)分成\(n\)份,而且可以分为\(0\)份. 这个的答案就是 \[ f(n)=\prod_{i=1}^m {a_i+n-1\choose n-1} \] 意思就是有\(a_i+n\)个球分成不为空\(n\)份的

【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

[BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻

Codeforces 100548F - Color (组合数+容斥)

题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选k种颜色有C(m, k)种方案,对于k种颜色方案为k*(k-1)^(n-1)种.但是C(m, k)*k*(k-1)^(n-1)方案包括了选k-1,k-2...,2种方案. 题目要求刚好k种颜色,所以这里想到用容斥. 但是要是直接C(m, k)*k*(k-1)^(n-1) - C(m, k-1)*(k

HAOI2018 [HAOI2018]染色 【组合数 + 容斥 + NTT】

题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只关心序列的 \(N\) 个位置中出现次数恰好为 \(S\) 的颜色种数, 如果恰 好出现了 \(S\) 次的颜色有 \(K\) 种, 则小 C 会产生 \(W_k\) 的愉悦度. 小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 1004535809 取模的结果是多少. 输入格式 从

【BZOJ2839】集合计数 组合数+容斥

[BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample Input 3 2 Sample Output 6 HINT [样例说明]假设原集合为{A,B,C}则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB

【BZOJ2339】[HNOI2011]卡农 组合数+容斥

[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确定的了.因为内层集合的n个元素可以随便出现,那么总数就是A(2^n-1,m-1).但是可能存在不合法的情况. 1.在前m-1个集合中,n个数出现的次数已经都是偶数了,那么第m个集合为空,不合法,此时方案数为f[m-1].2.第m个集合与之前某个集合相同,那么我们不考虑这两个集合,剩下的方案数为f[i

【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理

题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. 输入 第一行,四个整数N.M.T.P. 接下来的T行,每行两个整数,表示施工的路口的坐标. 输出 一

【bzoj3782】上学路线

Portal -->bzoj3782 Solution 权限题的话qwq简单说一下题面吧 就是要从\((0,0)\)走到\((n,m)\)然后中间有\(T\)个点是坏的(不能走),然后每次只能往上或者往右走,求方案数\(mod\ P\)的值,\(1<=n,m<=10^{10}\),\(0<=T<=200\),\(或p=1000003或1019663265\) ? 先不管范围 首先先看如果\(T=0\)的话怎么求,那么直接是\(\binom {n+m} n\)或者\(\bino

[BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 m 减去 Ai - 1 ,相当于将这一部分固定分给 xi,就转化为无限制的情况了. 如果有一些限制条件是 xi <= Ai 呢?直接来求就不行了,但是注意到这样的限制不超过 8 个,我们可以使用容斥原理来求. 考虑容斥:考虑哪些限制条件被违反了,也就是说,有哪些限制为 xi <= Ai 却是 xi