SCOI2010——字符串(Catalan数)
2013-03-28 11:14
232 查看
【题目描述】
lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数。现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?
【输入】
输入数据是一行,包括2个数字n和m
【输出】
输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数
【样例输入】
2 2
【样例输出】
2
【数据范围】
对于30%的数据,保证1<=m<=n<=1000
对于100%的数据,保证1<=m<=n<=1000000
解析:
这是一道关于Catalan数的“数学题"。。。
首先,一共m+n个数,组合数为c(m,m+n);
接下来进行转化:1对应往右上角走;0对应往右下角走
1的个数=0的个数:y=0;
1的个数<0的个数(不成立)y=-1;
(0,0)关于y=-1对称的点(0,-2)。。。即不成立的情况:从(0,-2)到(n+m,n-m)的路径总数为c(m-1,m+n)
综上:ans=c(m,n+m)-(m-1,n+m)
在1到mod中枚举ans并输出
代码:
lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数。现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?
【输入】
输入数据是一行,包括2个数字n和m
【输出】
输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数
【样例输入】
2 2
【样例输出】
2
【数据范围】
对于30%的数据,保证1<=m<=n<=1000
对于100%的数据,保证1<=m<=n<=1000000
解析:
这是一道关于Catalan数的“数学题"。。。
首先,一共m+n个数,组合数为c(m,m+n);
接下来进行转化:1对应往右上角走;0对应往右下角走
1的个数=0的个数:y=0;
1的个数<0的个数(不成立)y=-1;
(0,0)关于y=-1对称的点(0,-2)。。。即不成立的情况:从(0,-2)到(n+m,n-m)的路径总数为c(m-1,m+n)
综上:ans=c(m,n+m)-(m-1,n+m)
在1到mod中枚举ans并输出
代码:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int mod=20100403; int n,m; int main() { freopen("scoi20104.in","r",stdin); freopen("scoi20104.out","w",stdout); cin>>n>>m; long long num=n-m+1; for(long long i=n+2;i<=n+m;i++) (num*=i)%=mod; long long dfs=1; for(long long i=1;i<=m;i++) (dfs*=i)%=mod; for(int i=0;i<=mod;i++) if((i*dfs)%mod==num) { cout<<i; break; } return 0; }
相关文章推荐
- 洛谷[luogu] P1641 [SCOI2010]生成字符串(Catalan数(折线原理)+乘法逆元)
- BZOJ 1856: [Scoi2010]字符串 [Catalan数]
- 【Catalan数】【同余】【SCOI2010】字符串
- 【BZOJ 1856】 [Scoi2010]字符串
- bzoj1856: [Scoi2010]字符串
- [SCOI2010]生成字符串
- 逆元-洛谷P1641 [SCOI2010]生成字符串
- [BZOJ1856][SCOI2010]字符串(组合数)
- 1856: [Scoi2010]字符串
- [BZOJ 1856][SCOI 2010]字符串(组合数学)
- BZOJ1856:[SCOI2010]字符串——题解
- 【BZOJ】1856: [Scoi2010]字符串
- bzoj 1856: [Scoi2010]字符串 (组合数学)
- 【BZOJ 1856】 [Scoi2010]字符串
- 【BZOJ1856】[Scoi2010]字符串【组合数】【神题】
- 【bzoj1856】[Scoi2010]字符串
- BZOJ1856: [Scoi2010]字符串
- Bzoj1856:[Scoi2010]字符串:组合数学
- BZOJ1856 [SCOI2010]生成字符串 【组合数】
- [组合数学 卡特兰数] BZOJ 1856 [Scoi2010]字符串