题目大意:

密码串由小写字母、大写字母和数字组成,要求求出小写字母个数不少于L个、大写字母个数不少于U个、数字个数不少于D个的长度为N密码串的种数。

答案对 1000000009 取模

解题思路:

自己不会,看了neal_wu的代码,表示膜拜。

令a表示小写字母个数,b表示大写字母个数,c表示数字个数,则a>=L,b>=U,c>=D,a+b+c=N。

按照一般来讲会首先想到枚举数字个数再枚举小写字母个数,然后就用组合数求种数,这个是最自然的想法,但是时间复杂度不堪忍受。

这题有个规律,

因为数字比较特殊,它只有10种,而小写字母和大写字母都是26种,所以小写字母和大写字母可以一起考虑,然后用组合数区分种数,于是先枚举数字。

当数字个数为c时,种数num=sum{pow(10,c)*choose(N,c)*pow(26,N-c)*choose(N-c,k)},L<=k<=N-c-U

考虑到c是枚举量,所以num=pow(10,c)*pow(26,N-c)*choose(N,c)*sum{choose(N-c,k)},L<=k<=N-c-U

于是num的值跟一段连续的组合数求和有关,只要能o(1)求出sum{choose(N-c,k)},L<=k<=N-c-U的值,就能O(1)求出num的值,就能O(n)解决问题。

设H(c)=sum{choose(N-c,k)},L<=k<=N-c-U

可以得之有递推式:H(c-1)=2*H(c)+choose(N-c,L-1)+choose(N-c,N-c-U+1);

初始条件:          H(N-L-D)=choose(N-c,L);

所以c从N-L-D往下枚举到D,维护H(c)的递推值,就能O(n)解决该题。

思考中:

因为这题涉及到杨辉三角中的一个正的三角形,它要求的值ans等于那个三角形的一行的和乘以一个无关紧要系数的值的和,所以可以用一个值维护行的和就能避免O(n^2)枚举值,降低一维复杂度。

在正三角形中假设H(i)表示第i行的值的和以及第i行是杨辉三角的第Y(i)行,起点是这一行的第X(i)个,

则H(1)=choose(Y(i),X(i))

H(i+1)=2*H(i)+choose(Y(i),X(i)-1)+choose(Y(i),X(i)+i)

在倒三角形中也是可以递推H(i)的,H(1)表示最下面的那一个值,

H(1)=choose(Y(i),X(i))

H(i+1)=(H(i)-choose(Y(i)-1,X(i)-1)-choose(Y(i)-1,X(i)+i-1))/2+choose(Y(i)-1,X(i)-1)+choose(Y(i)-1,X(i)+i-1)

也可以O(1)维护。

TCO'10 Online Round 3 1000pt的更多相关文章

  1. TCO'10 Wildcard Round 1000pt

    题目大意: 给定一个N*M的棋盘,棋子可以攻击其左右距离不超过K的棋子.问有多少种放法使得棋盘上的棋子不能互相攻击. N,M,K都在1到1000000000的范围内,结果对100003取模. 官方题解 ...

  2. [每日一题2020.06.10]Codeforces Round #644 (Div. 3) ABCDEFG

    花了5个多少小时总算把div3打通一次( 题目链接 problem A 题意 : 两个x*y的矩形不能重叠摆放, 要放进一个正方形正方形边长最小为多少 先求n = min(2x, 2y, x+y) 再 ...

  3. matlab初学之roundn和round

    文章出处: http://evaevazhuxun.blog.sohu.com/154543859.html http://blog.sina.com.cn/s/blog_a4034b2801012o ...

  4. delphi的取整函数round、trunc、ceil和floor

    delphi的取整函数round.trunc.ceil和floor 首先引入math单元 uses math; 1.Round(四舍六入五留双) 功能说明:对一个实数进行四舍五入.(按照银行家算法) ...

  5. Python基础(10)--数字

    本文的主题是 Python 中的数字.会详细介绍每一种数字类型,它们适用的各种运算符, 以及用于处理数字的内建函数.在文章的末尾, 简单介绍了几个标准库中用于处理数字的模块. 本文地址:http:// ...

  6. python 内建函数功能函数 abs() coerce() divmod() round() pow()

    >>> abs(-1)1>>> abs(10.)  10.0>>> abs(1.2-2.1j)2.4186773244895647>> ...

  7. Delphi 常用函数(数学函数)round、trunc、ceil和floor

    源:Delphi 常用函数(数学函数)round.trunc.ceil和floor Delphi 常用函数(数学) Delphi中怎么将实数取整? floor 和 ceil 是 math unit 里 ...

  8. SQL 中详解round(),floor(),ceiling()函数的用法和区别?

    SQL 中详解round(),floor(),ceiling()函数的用法和区别? 原创 2013年06月09日 14:00:21   摘自:http://blog.csdn.net/yueliang ...

  9. Oracle案例10——HWM(高水位线)性能优化

    最近BI同事反馈说一张表的数据查询非常慢,这个表数据总共不到1W行数据,这么一说我们首先想到的是高水位带来的性能问题,即高水位线下占用过多数据块,而这些数据块其实是部分数据占用,大多数是空闲的数据块. ...

随机推荐

  1. 在AppCode中的razor调用HtmlHelper方法和UrlHelper方法

    原文发布时间为:2011-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 可以写一个帮助类,如下 using System.Web.WebPages;using System.Web.Mv ...

  2. 64位操作系统安装32位客户端和PL/SQL

    PL/SQ只能使用32位的Oracle客户端.在64位系统下安装了64位的oracle 11g,使用PL/SQL需再安装32位Oracle客户端. 按以下方法试验成功: 1)安装32位的Oracle客 ...

  3. 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断

    CPU上处理的中断可以分成“硬件中断”和“软件中断”两类,比如网卡产生的中断称为硬件中断,而如果是软件使用诸如"int 0x10"(X86平台上)这样的指令产生中断称为软件中断,硬 ...

  4. UVA 10803 Thunder Mountain

    纠结在这句话了If it is impossible to get from some town to some other town, print "Send Kurdy" in ...

  5. Java解决跨域的方案

    在后台加上,在数据返回之前添加 response.setHeader("Access-Control-Allow-Origin","*"); 就可以了,前台不用 ...

  6. 【微信】根据appid, secret, code获取用户基本信息

    function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...

  7. 服务的注册与发现Eureka(二)

    1.服务治理概念 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容错等,实现服务发现与注册. 2.服务的注册与 ...

  8. FZU-2268 Cutting Game(二进制使用)

     Problem 2268 Cutting Game Accept: 254    Submit: 605Time Limit: 1000 mSec    Memory Limit : 32768 K ...

  9. PDF审计工具peepdf

    PDF审计工具peepdf   PDF是Portable Document Format(便携式文档格式)的缩写.它是Adobe公司推出的文件格式规范.现在,PDF是网络电子书籍的主流格式.由于PDF ...

  10. [BZOJ 4031] 小Z的房间

    Link: BZOJ 4031 传送门 Solution: 矩阵树定理的模板题 看完下面两篇文章就会啦: 周冬论文:https://wenku.baidu.com/view/872eb02de2bd9 ...