bzoj1856 [ SCOI2010 ] -- 卡特兰数
2018-06-17 23:06:41来源:未知 阅读 ()
其实就是卡特兰数的定义。。。
将放置一个1视为(1,1),放置一个0视为(1,-1)
则答案就是从(0,0)出发到(n+m,n-m)且不经过y=-1的方案数。
从(0,0)出发到(n+m,n-m)的总方案数是C(n+m,n)。
若一条路径经过y=-1,那么将其从(0,0)到y=-1的一段路径以y=-1作对称,就变成了一条从(0,-2)到(n+m,n-m)的路径。
设走了x步(1,1),y步(1,-1),则:x+y=n+m,x-y=n-m+2,解得x=n+1,y=m-1.
那么答案就是C(n+m,n)-C((n-1)+(m-1),n+1)=C(n+m,n)-C(n+m,n+1)
因为有取模,所以还需要求逆元。
递推公式:inv[i]=inv[p%i]*(p-p/i)%p,要将inv[0]和inv[1]初始化为1
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 #define M 20100403 6 #define ll long long 7 int i,j,k,n,m,x,y,inv[1000010]; 8 inline int _Max(int x,int y){return x<y?y:x;} 9 inline ll C(int x,int y){ 10 ll Ans=x+1; 11 for(int i=2;i<=y;i++)Ans=(Ans*(x+i)%M)*inv[i]%M; 12 return Ans; 13 } 14 int main() 15 { 16 scanf("%d%d",&n,&m); 17 for(inv[0]=inv[1]=1,i=2;i<=m;i++)inv[i]=1ll*inv[M%i]*(M-M/i)%M; 18 printf("%lld",(C(n,m)-C(n+1,m-1)+M)%M); 19 return 0; 20 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:3117 高精度乘法
- BZOJ1853: [Scoi2010]幸运数字(容斥原理) 2018-09-01
- BZOJ1854: [Scoi2010]游戏(二分图匹配) 2018-07-09
- bzoj1857 [ SCOI2010 ] -- 三分套三分 2018-06-17
- BZOJ 1854: [Scoi2010]游戏 2018-06-17
- BZOJ1857: [Scoi2010]传送带(三分套三分) 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash