【BZOJ】1856: [Scoi2010]字符串

http://www.lydsy.com/JudgeOnline/problem.php?id=1856

题意:把n个1和m个0组成字符串,要求在组成的字符串中,任意的前k个字符1的个数不能少于0的个数。求字符串共有多少个。(1<=m<=n<=1000000)

#include <bits/stdc++.h>
using namespace std;
const int M=20100403;
typedef long long ll;
int mpow(int a, int b) { int x=1; for(; b; b>>=1, a=(ll)a*a%M) if(b&1) x=(ll)x*a%M; return x; }
int fac(int n) { int x=1; for(int i=2; i<=n; ++i) x=(ll)x*i%M; return x; }
int main() {
	int n, m;
	cin >> n >> m;
	cout << (ll)(n+1-m)*fac(n+m)%M*mpow((ll)fac(n+1)*fac(m)%M, M-2)%M << endl;
	return 0;
}

  

好题啊= =

将狼踩尽神犇写的题解太赞了= =:http://www.cnblogs.com/jianglangcaijin/p/3443689.html

我来简单说一下....

首先总方案数有$\binom{n+m}{n}$,然后有$\binom{n+m}{n+1}$是不合法的= =然后就行辣= =(送个配图= =

时间: 2024-10-14 12:41:22

【BZOJ】1856: [Scoi2010]字符串的相关文章

BZOJ 1856 [Scoi2010]字符串 组合数

题意: 找出由n个1,m个0组成的字符串,且任意前几个字符中1的个数不能比0的个数少,询问满足要求的字符串个数. 解析: 很容易转化一下题意,转化到从一个矩阵的左下走到右上不能过某条线的方案数. 如果我们把1看作走一个向量(1,1),0看作走一个向量(1,-1),那么我们可以把模型转化成从(0,0)走到(n+m,n-m)并且不能经过直线y=-1的方案数. 暂且不考虑限制答案显然为C(n+m,m),如果考虑限制的话,我们看图发现经过y=-1的情况可以看作从(0,-2)出发到(n+m,n-m)的方案

bzoj 1856: [Scoi2010]字符串

1 #include<cstdio> 2 #include<iostream> 3 #define Q 20100403 4 long long n,m,a,b,k,ans=1; 5 int main() 6 { 7 scanf("%lld%lld",&n,&m); 8 b=(n-m+1)%Q; 9 for(int i=2;i<=m+n;i++) 10 b=(b*i)%Q; 11 a=1; 12 for(int i=2;i<=n+1;

1856: [Scoi2010]字符串

1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 434[Submit][Status] Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗? Input 输入数据是一行,包

1856: [Scoi2010]字符串 卡特兰数

1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1458  Solved: 814[Submit][Status][Discuss] Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗? Input

bzoj1856: [Scoi2010]字符串

1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1301  Solved: 719[Submit][Status][Discuss] Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗? Input

bzoj 1858: [Scoi2010] 序列操作 题解

[原题] 1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1031  Solved: 529 [Submit][Status] Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内

字符串(bzoj 1856)

Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗? Input 输入数据是一行,包括2个数字n和m Output 输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数 Sample Input 2 2 Sample O

BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. ---------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int MAXL = 10009, MAXR = 1000009; struct edge { int to; edge* next; } E[MAXR <<

BZOJ 1090: [SCOI2003]字符串折叠( 区间dp )

按照题意dp...dp(l, r) = min{ dp(l, x) + dp(x+1, r) , 折叠(l, r) } 折叠(l, r)我是直接枚举长度然后哈希判.. -------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int maxn = 109; con