hdu 3398

思路很绝,是看解题报告的,把字符串组合问题改装为平面上走路模型,以下就是大牛的思路:

 

题意:求由n1m0组成,并且任意前缀中1的个数不少于0的个数的字符串的个数,并模20100501

分析:这题很赞,首先是模型的转化或者说是公式的推导,这里用到了一个非常巧妙的转化。

:我们设初始在坐标系的原点(0,0),从字符串第一位开始,碰到一个0就向上走,碰到一个1就向右走,那么由n1m0组成的字符串最后必定走到(n,m)点,即满足由n1m0组成的字符串的个数为C(n+m,n) = C(n+m,m) (满足n+m长度内n个长度走1或者m个长度走0)

:对于任意前缀中1的个数不少于0的个数的字符串的个数这个条件,可以看成是坐标系中,从(0,0)点走到(m, n)点,并且跟y=x-1这条直线不相交的方案数。又因为(0,0)点关于直线y=x-1的对称点是(1,-1),而从(1,-1)点走到(m, n)点的所有方案一定都会与直线y=x-1相交,对于这些方案,将从(1,-1)点到与y=x-1的第一个交点之间的路径关于y=x-1对称翻转过去,就可以得到所有不满足题意的从(0,0)点走到(m, n)点的方案,于是最终答案就是C(n+m, n)-C(n+m,n+1)

 

接下来就是求上式子模20100501的值,因为nm很大,所以我们利用质因数分解来分解阶乘,然后分子分母抵消指数最后求指数幂的和即可,但是这样做还是会TLE。而用对于阶乘,有很多非常好的性质可以利用(不利用就TLE。。。),下面介绍N!的质因数分解,也就是求N!x的幂,首先因为N! = 1*2*3*……*N,所以N!x的幂就是各个数质因数分解后x的幂之和,考虑含1,2,……,N中含x^1的共有x^1,2*x^1,……,y*x^1y个,其中y=floor(N/x^1),而含x^2的共有x^2,2*x^2,……,y*x^2y个,其中y=floor(N/x^2)=floor((N/x)/x),所以可以利用递归来计算N!x的幂

 

 

照着大牛的思路写了一下,叹服于这种思路!

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值