bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp
LINK:上学路线
从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模.
\(1\leq N,M\leq 10^10 0\leq T\leq 200\)
p=1000003或p=1019663265
考虑dp......(没啥意义.
要求出 从(0,0)到(n,m)不经过一个障碍点的方案数 显然需要容斥. 所有方案C(n+m,n).
还是考虑dp 将T个障碍点排序之后可以发现 后面的点一定不会经过前面的点。
设f[i]表示到达第i个点且不经过前面i-1个点的方案数。我们把终点也当成障碍点 可以发现最后一个f值就是答案辣.
这个是一个很经典的代表元容斥.
考虑到达i这个点 的总方案数 C(\(x_i+y_i,x_i\)).过程中肯定会经过其他的点的。
我们只需要知道经过的第一个不合法的点是谁就可以减掉对应的不合法方案辣。
可以发现这样做把所有的不合法方案都给减掉了。
复杂度T^2. 考虑过程中的组合数怎么做 卢卡斯定理!
P=10000003还好做一点 P=1019663265...
经典套路 摁两下计算器就会了 1019663265=5×3×6793×10007.四个都是质数。
比扩展卢卡斯要简单一点的东西 可以中国剩余定理来解决。
const ll MAXN=1000010,maxn=210;
ll n,m,k,mod,p,xx,yy;
struct wy
{
ll inv[MAXN];
ll fac[MAXN];
ll mod,ans;
}t[5];
ll f[maxn];
struct jl{ll x,y;}s[maxn];
inline ll ksm(ll b,ll p,ll mod)
{
ll cnt=1;//cout<<b<<endl;
while(p)
{
if(p&1)cnt=cnt*b%mod;
b=b*b%mod;p=p>>1;
}
return cnt;
}
inline void prepare()
{
rep(1,p,i)
{
ll maxx=m(i)-1;t[i].fac[0]=1;
rep(1,maxx,j)t[i].fac[j]=t[i].fac[j-1]*j%m(i);
t[i].inv[maxx]=ksm(t[i].fac[maxx],m(i)-2,m(i));
fep(maxx-1,0,j)t[i].inv[j]=t[i].inv[j+1]*(j+1)%m(i);
}
}
inline ll cmp(jl a,jl b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline ll C(ll p,ll a,ll b){return t[p].fac[a]*t[p].inv[b]%m(p)*t[p].inv[a-b]%m(p);}
inline ll Lucas(ll p,ll a,ll b)
{
if(a<b)return 0;
if(a<m(p))return C(p,a,b);
return Lucas(p,a/m(p),b/m(p))*Lucas(p,a%m(p),b%m(p))%m(p);
}
inline void exgcd(ll a,ll b)
{
if(!b){xx=1,yy=0;return;}
exgcd(b,a%b);
ll zz=xx;xx=yy;yy=zz-a/b*yy;
}
inline ll INV(ll a,ll b)
{
exgcd(a,b);
return (xx%b+b)%b;
}
inline ll solve(ll a,ll b)
{
rep(1,p,i)ans(i)=Lucas(i,a,b);//,cout<<ans(i)<<endl;
if(p==1)return ans(p);
//中国剩余定理.
ll ans=0;
rep(1,p,i)
{
ll M=mod/m(i);
ll ww=INV(M,m(i));
ans=(ans+M*ww%mod*ans(i))%mod;
}
return ans;
}
signed main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(k);get(mod);
if(mod==1000003)m(p=1)=mod;
else
{
m(p=1)=3;m(p=2)=5;
m(p=3)=10007;m(p=4)=6793;
}
prepare();//cout<<solve(3,2)<<endl;
rep(1,k,i){ll get(x);s[i]=(jl){x,read()};}
sort(s+1,s+1+k,cmp);
s[++k]=(jl){n,m};
rep(1,k,i)
{
f[i]=solve(s[i].x+s[i].y,s[i].x);
rep(1,i-1,j)if(s[j].y<=s[i].y)
f[i]=(f[i]-f[j]*solve(s[i].x-s[j].x+s[i].y-s[j].y,s[i].x-s[j].x))%mod;
}
put((f[k]+mod)%mod);return 0;
}
又复习了一遍卢卡斯定理 和 中国剩余定理。/ll
bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp的更多相关文章
- BZOJ 3782: 上学路线 [Lucas定理 DP]
3782: 上学路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 192 Solved: 75[Submit][Status][Discuss] ...
- BZOJ 3782: 上学路 Lucas+ExCRT+容斥+dp
其实呢,扩展中国剩余定理还有一种理解方式:就是你有一坨东西,形如:$A[i]\equiv B[i](mod$ $P[i])$. 对于这个东西,你可以这么思考:如果最后能求出一个解,那么这个解的增量一定 ...
- HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法
地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others) M ...
- BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
我们枚举第一个经过的坏点,然后DP即可. 状态转移方程不是难点,难点在于组合数的处理. 将狼踩尽的博客中有很详细的证明过程,但是我只记住了结论 $n=a_1 * p^k+a_2*p^k-1...$ $ ...
- BZOJ 3782 上学路线
首先这个题需要dp.dp[i]=C(x[i]+y[i],x[i])-Σdp[j]*C(x[i]-x[j]+y[i]-y[j],x[i]-x[j])(x[i]>=x[j],y[i]>=y[j ...
- HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]
Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
随机推荐
- activiti6基础01-如何数据库操作及相关表
官网文档:https://www.activiti.org/userguide/#queryAPI 1. Activit的简单源码解读 activiti的官方文档讲解详细很详细,也很范.按着 ...
- (五)ELK Logstash output
# 输出插件将数据发送到一个特定的目的地, 除了elasticsearch还有好多可输出的地方, 例如file, csv, mongodb, redis, syslog等 output { if [t ...
- 传递 HDU - 5961 题解
题目传送门 分析 题目大意:给一个竞赛图,将图分成两部分,判断两部分的图是否符合传递闭包,a->b,b->c,则a->c 这道题用Floyd硬跑的显然n\({^3}\)会T 如果用b ...
- 包含min函数的栈(剑指offer-20)
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法 ...
- java 面向对象(十五):面向对象的特征三:多态性
1.多态性的理解:可以理解为一个事物的多种形态.2.何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)举例:Person p = new Man();Object obj ...
- 03-Python控制语句
一.简介 通过一些语句来改变程序的执行顺序,这些语句被叫做控制语句,在python主要有if.for.while三种控制流语句. 二.if语句 用来检测一个条件是否成立,如果为真,则执行该语句(一般为 ...
- educoder SML程序设计题线下编译环境搭建
背景 最近<串并行数据结构与算法设计>的老师在educoder上布置了一些SML程序设计题,虽然网站上有在线编译功能,但还是在线下编译调试方便,特记录编译环境过程如下(我用的GVIM,但N ...
- 用PyInstaller打包用PyQt5编写的python程序
0.背景 本弱初学PyQt5,写了一个GUI小程序,但在用PyInstaller打包时出现了不少问题,现将几个比较大的问题记录如下,希望以后能记住. 1. 资源打包 首先是资源打包的问题,我写的程序引 ...
- bzoj3526[Poi2014]Card*
bzoj3526[Poi2014]Card 题意: 有n张卡片在桌上一字排开,每张卡片上有两个数,第i张卡片上,正面的数为a[i],反面的数为b[i].有m个操作,第i个操作会交换c[i]和d[i]两 ...
- bzoj3043IncDec Sequence*
bzoj3043IncDec Sequence 题意: n个数,每次可以将区间l到r里的数+1或-1,问将它们变成同个数的最小操作次数和保证最小操作次数前提下有多少中可能.n≤100000. 题解: ...