【7.13】代码源 -【饿饿 饭饭】【路径计数2】【函数求和】

#463. 饿饿 饭饭

题意:有 n ( n ≤ 1 0 5 ) n(n\leq 10^5) n(n105) 个同学正在排队打饭,第 i i i 个同学排在从前往后第 i i i 个位置。但是这天食堂内只有一个食堂阿姨,为了使同学们都能尽快的吃上饭,每一个同学在打完一份饭之后就会排在队伍的末尾先吃着打到的饭,我们知道第i个同学的饭量为 a i a_i ai ,也就是说第i个同学要吃 a i a_i ai 份饭才能吃饱,当一位同学吃饱后,他就会立刻离开食堂,不会排在队伍的末尾。食堂阿姨想知道,在打完 k k k 份饭之后,队伍的样子是怎样的,但是食堂阿姨数学不太好,想让你帮忙想想办法。

思路:二分一下会完整的走过几轮。二分出来之后,把仍在食堂的学生挑出来,模拟 k ′ k' k 次即可。

AC代码:http://oj.daimayuan.top/submission/286216


#467. 路径计数2

题意:有一个 n × n ( 1 ≤ n ≤ 1 0 6 ) n\times n(1\leq n\leq 10^6) n×n(1n106) 的网格,有些格子是可以通行的,还有 m ( m ≤ 3000 ) m(m\leq 3000) m(m3000) 个格子是障碍。

一开始你在左上角的位置,你可以每一步往下或者往右走,问有多少种走到右下角的方案。

由于答案很大,输出对 1 0 9 + 7 10^9+7 109+7 取模的结果。

题解:(动态规划) 有障碍的路径计数 (代码源每日一题Div1)

思路:去枚举每一个格子肯定是不行的,我们可以考虑只枚举障碍,看是否能计算出答案。

我们定义 d p ( i ) dp(i) dp(i) 为从起点走到第 i i i 个障碍而不经过其他障碍的路径数量,把终点当作最后一个障碍,记得得出答案。怎么递推呢?可以用容斥的思想,我们容易知道知道起点走到某障碍 ( x , y ) (x,y) (x,y) 的路径数量(不考虑其他障碍)为 C x − 1 + y − 1 x − 1 C_{x-1+y-1}^{x-1} Cx1+y1x1 ,那么需要计算出至少经过一个障碍的路径数量并减去。对于这种路径,我们按照路径第一个经过的障碍编号来分类,假如可能经过 m m m 个障碍,那么第一个经过障碍 j j j 的路径数量为 d p ( j ) × C x j − x i + y j − y i x j − x i , j ∈ [ 1 , m ] dp(j)\times C_{x_j-x_i+y_j-y_i}^{x_j-x_i},j\in[1,m] dp(j)×Cxjxi+yjyixjxi,j[1,m]

AC代码:http://oj.daimayuan.top/submission/286311


#468. 函数求和

题意: n ≤ 100 , k ≤ 60 n\leq 100,k\leq 60 n100,k60在这里插入图片描述

思路:考虑枚举 i = f ( x ) i=f(x) i=f(x) 来计算有多少个 x x x 使得 f ( x ) = i f(x)=i f(x)=i 。要使得 a i & x ≠ a i a_i\&x\ne a_i ai&x=ai ,需要 a i a_i ai 为一的位上 x x x 至少有一位是 0 0 0 。那么我们初始有一个长度为 k k k 的二进制数,每一位初始都是 ∗ * 即自由态。我们遇到 a i a_i ai 时,设 m o d mod mod a i a_i ai 为 1 且 x x x ∗ * 的位数, n m o d nmod nmod a i a_i ai 为 0 且 x x x ∗ * 的位数。

我们要使得 a i a_i ai 为 1 的位上 x x x 至少有一位是 0 0 0 ,那么可以把 2 m o d + n m o d 2^{mod+nmod} 2mod+nmod 这剩下的数量分类为 ( 2 m o d − 1 ) × 2 n m o d (2^{mod}-1)\times 2^{nmod} (2mod1)×2nmod 2 n m o d 2^{nmod} 2nmod ,前者是对应 a i a_i ai 位上至少一位是 0 的个数,剩下的则是对应 a i a_i ai 位上全部是 1 的个数。然后把 m o d mod mod 对应位从 ∗ → 1 *\rightarrow1 1 即可。

AC代码:http://oj.daimayuan.top/submission/286438

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值