【BZOJ3782】上学路线 组合数+容斥+CRT
【BZOJ3782】上学路线
Description
Input
Output
Sample Input
3 0
1 1
2 2
Sample Output
HINT
题解:从(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
【BZOJ3782】上学路线 组合数+容斥+CRT的更多相关文章
- BZOJ3782 上学路线 【dp + Lucas + CRT】
题目链接 BZOJ3782 题解 我们把终点也加入障碍点中,将点排序,令\(f[i]\)表示从\((0,0)\)出发,不经过其它障碍,直接到达\((x_i,y_i)\)的方案数 首先我们有个大致的方案 ...
- bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)
传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...
- bzoj3782上学路线
题意:从n*m网格图的左下角走到右上角(n,m<=10^10),有t个坐标不能经过(t<=200),只能向上向右走,问有多少种不同的走法,对p取模, p只有两种取值,1000003(质数) ...
- Codeforces 100548F - Color (组合数+容斥)
题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...
- BZOJ5306 [HAOI2018]染色 【组合数 + 容斥 + NTT】
题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只 ...
- 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥
[BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...
- cf997C. Sky Full of Stars(组合数 容斥)
题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...
- BZOJ3782 上学路线
设障碍个数为,\(obs\)则一般的容斥复杂度为\(O(2^{obs})\).但因为这个题是网格图,我们可以用DP解.设\(f[i]\)表示不经过任何障碍到达第\(i\)个障碍的方案数,转移时枚举可以 ...
- HDU - 5201 :The Monkey King (组合数 & 容斥)
As everyone known, The Monkey King is Son Goku. He and his offspring live in Mountain of Flowers and ...
随机推荐
- UVa11361 Investigating Div-Sum Property
数位DP f[位数][自身模k余数][各位数字之和模k余数][当前位是否有上限]=方案数 k<10000,空间不够,如何优化? 不必优化,2^31以内,数字最多只有10位,各位数字之和最多为99 ...
- linux环境内存分配原理 mallocinfo【转】
转自:http://www.cnblogs.com/dongzhiquan/p/5621906.html Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和fr ...
- linux 下高精度时间
今天在公司代码中看到了使用select函数的超时功能作定时器的用法,便整理了如下几个Linux下的微秒级别的定时器.在我的Ubutu10.10 双核环境中,编译通过. /* * @FileName: ...
- GSMArena battery life test
GSMArena battery life test Battery Endurance Score = [ Battery Capacity / ( call hrs * a + Browsing ...
- Yii中的数据库事务的使用方法小结
在项目中遇到批量删除的地方一般会使用到事务,下面列举一个用法实例与大家分享. 查看代码 打印 01 <?php 02 $array=array( 03 0=>array('us ...
- CodeForces 424D: ...(二分)
题意:给出一个n*m的矩阵,内有一些数字.当你从一个方格走到另一个方格时,按这两个方格数字的大小,有(升,平,降)三种费用.你需要在矩阵中找到边长大于2的一个矩形,使得按这个矩形顺时针行走一圈的费用, ...
- springboot 启动类启动跳转到前端网页404问题的两个解决方案
前段时间研究springboot 发现使用Application类启动的话, 可以进入Controller方法并且返回数据,但是不能跳转到WEB-INF目录下网页, 前置配置 server: port ...
- 定时任务crontab如何实现每秒执行?
linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 方法一:crontab -l内容如下,则每10秒执行一次/home/fdipzone/ph ...
- Frotinet60D IP映射 開放指定端口是實際應用
有多個外網IP的環境中,在某一部電腦上,如何使用多個外網IP中的某一個?且為使用的Bitcomet開放TCP,TUP特定端口? 1.在本機windows防火墻中"輸入" 和&quo ...
- Appium 从 0 到 1 搭建移动 App 功能自动化测试平台 (1):模拟器中运行 iOS 应用
转载:https://testerhome.com/topics/4960 在上一篇文章中,我对本系列教程的项目背景进行了介绍,并对自动化测试平台的建设进行了规划. 在本文中,我将在已准备就绪的iOS ...