博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SCOI2010]生成字符串
阅读量:4518 次
发布时间:2019-06-08

本文共 1021 字,大约阅读时间需要 3 分钟。

题目大意:给出n个‘1’,m个‘0’,求用这些组成的串中,满足“前k个字符中1数不小于0数”的串的个数。(对20100403取模)

同学互测题出了原题,当时蒙蔽。除了一眼看出的dp:dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i ][ j-1 ];

然后就是持续蒙蔽。。。

最后同学讲题,讲了一个非常nb的构造算法:

将串想象成一个巨大的表格中的一条折线,其中1代表45度向上,0代表45度向下。

要控制1>=0,只需要控制这条线保持在第一象限。

怎么计算不合法情况呢?我们只需要将折线的一部分对称下来,形成一条从( -2 , 0 )到终点的折线,此时有映射。

(下面是结论:)

ans = C( n , n+m ) - C( n+1 , n+m);

代码:

#include
#include
using namespace std;#define MOD 20100403#define ll long long#define N 1000050ll n,m;ll ny[N<<1],jc[N<<1],jny[N<<1];void init(){ jc[0]=jc[1]=ny[1]=jny[0]=jny[1]=1; for(ll i=2;i<=n+m;i++) { ny[i]=((MOD-MOD/i)*ny[MOD%i]%MOD+MOD)%MOD; jc[i]=(jc[i-1]*i)%MOD; jny[i]=(jny[i-1]*ny[i])%MOD; }}ll C(ll a,ll b){ ll ret = jc[b]; ret = (ret * jny[a])%MOD; ret = (ret * jny[b-a])%MOD; return ret;}int main(){ scanf("%lld%lld",&n,&m); init(); ll ans = ((C(n,n+m)-C(n+1,n+m))%MOD+MOD)%MOD; printf("%lld\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/9743680.html

你可能感兴趣的文章
Navicat Premium 10/12——破解激活
查看>>
【leetcode❤python】 290. Word Pattern
查看>>
Mysql备份还原数据库之mysqldump实例及参数详细说明 -转自http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html...
查看>>
2013年10月13日学习:SQL通过命令语句来创建表
查看>>
剑指offer : 二维数组中的查找
查看>>
第三章 python基础
查看>>
java基础题
查看>>
[转]人人店短信插件开发
查看>>
[转]c# System.IO.Ports SerialPort Class
查看>>
14. 最长公共前缀
查看>>
Redis文档
查看>>
项目重构
查看>>
iOS 开发 证书总结 开发证书和生产证书的区别
查看>>
(笔试题)和一半的组合数
查看>>
leetcode--Algorithm--Array_Part 1 Easy- 566 Reshape the Matrix
查看>>
AC自动机算法详解 (转载)
查看>>
python3-day5(模块)
查看>>
Linux配置JDK
查看>>
qt 读取xml文件
查看>>
python3之正则表达式
查看>>