zoukankan      html  css  js  c++  java
  • luogu1641 [SDOI2010]生成字符串

    题目大意

      把$n$个$1$和$m$个$0$组成字符串,在任意的前$k$个字符中,$1$的个数不能少于$0$的个数。求这样的字符串的个数。$1leq mleq nleq 1000000$。

    原始模型

      在坐标网格中,规定一个合法的路径如下:1. 起点为$(0, 0)$,终点为$(n, m)$;2. 该路径是个曼哈顿路径;3. 该路径在直线$l:y=x$的下方,且不接触$l$。求合法的路径的种类数。

      这类题的入手点在于:所有合法的路径都会经过点$(1,0)$,起点为$(1,0)$终点为$(n,m)$的曼哈顿路径数为$C_{n+m-1}^m$。而我们要在此基础上去除掉中途经过直线$l$的种类数。我们知道,起点为$(0,1)$,终点为$(n,m)$的曼哈顿路径(设组成的集合为$A$)一定经过直线$l$,这个交点最小可以到达$(1,1)$。而所有经过$(1,0)$且不合法的路径(设组成的集合为$B$)必然也经过直线$l$,交点最小为$(1,1)$,所以对于任意一条路径$pin B$,如果$p'$是$p$把$(0,0)$至与$l$最后一个交点的部分按照直线$l$翻折得到的路径,则$p'in A$。同理可得$A,B$满足一一映射关系。对于$forall p'in A$,其必须要向上走$m-1$步,总共要走$n+m-1$步,所以不合法的情况为$C_{n+m-1}^{m-1}$

      综上所述,结果为$C_{n+m-1}^m - C_{n+m-1}^{m-1}$

    本题题解

      选1相当于向右走一格,选0相当于向上走一格,原先的条件便变成了可接触$l$。咱们把$y=x$改为$y=x+1$,同理可得答案为$C_{n+m}^m - C_{n+m}^{m-1}$。用预处理阶乘、乘法逆元、组合数通项公式等即可求解。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    #define ll long long
    const int MAX_N = 2000010;
    const ll P = 20100403;
    ll Fact[MAX_N];
    
    void GetFact()
    {
    	Fact[1] = 1;
    	for (int i = 2; i < MAX_N; i++)
    		Fact[i] = Fact[i - 1] * i % P;
    }
    
    ll Mult(ll a, ll b)
    {
    	ll ans = 0;
    	while (b)
    	{
    		if (b & 1)
    			ans = (ans + a) % P;
    		a = (a + a) % P;
    		b >>= 1;
    	}
    	return ans;
    }
    
    ll Power(ll a, ll n)
    {
    	ll ans = 1;
    	while (n)
    	{
    		if (n & 1)
    			ans = Mult(ans, a);
    		a = Mult(a, a);
    		n >>= 1;
    	}
    	return ans;
    }
    
    ll Inv(ll x)
    {
    	return Power(x, P - 2);
    }
    
    ll C(int n, int r)
    {
    	return Fact[n] * Inv(Fact[r] * Fact[n - r] % P) % P;
    }
    
    int main()
    {
    	GetFact();
    	int n, m;
    	scanf("%d%d", &n, &m);
    	printf("%lld
    ", ((C(m + n, m) - C(m + n, m - 1)) % P + P) % P);
    	return 0;
    }
    

      

  • 相关阅读:
    spy++工具
    select 设置发送超时发送注意事项
    C++ Socket超时设置
    linux下的find文件查找命令与grep文件内容查找命令
    C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
    vc6.0出现“cannot add new member”解决办法
    Nginx虚拟主机配置(20200202)
    Centos7内核版安装nginx环境问题及解决方法
    Nginx架构分析(20200202)
    软链接和硬链接——Linux中的文件共享
  • 原文地址:https://www.cnblogs.com/headboy2002/p/9588876.html
Copyright © 2011-2022 走看看