python123反素数_洛谷蓝题解题报告(2020.8.4-2020.8.9)

2020.8.4

P1450 [HAOI2008]硬币购物

考察:背包dp,容斥原理

主要是一个dp容斥的思想:

用背包处理无数量限制的方案值,减去某些硬币超出数量限制的方案值。

减去不合规范方案的方法:

直接将总的钱数减去(该硬币数+1)*该硬币价值进行dp,确保该硬币超出限制。

最后套一下容斥原理的公式即可。

P1438 无聊的数列

考察:线段树,差分

区间求和,区间修改,自然想到线段树,以等差数列的方式修改,自然想到用相邻两数之差(即差分的思想)进行建树,查询时即为1-i的区间和。

几乎是个线段树差分的模板题。

P2279 [HNOI2003]消防局的设立

考察:树形dp

看到树,看到求最小值,自然想到树形dp.

树形dp就是从子孙的状态向父亲的状态推,根据题意,两个消防局之间可以至多空4个点,因此想到设状态为子树中离自己最近的消防局的距离,从1-4不同的状态转移到父节点。

树形dp的准板子题

P1463 [POI2002][HAOI2007]反素数

考察:搜索

题意即为1-N区间内找约数最多的数

看到N的范围,这里用质数筛,用约数公式,用dp都不好使

想到每个数分解成质因数的数量是log级别的

于是筛出1-20之间的素数,暴力枚举每个质数的个数,用约数个数公式比较计算。

一种全新的计算约数个数的思维。

P1490 买蛋糕

考察:搜索

题意为用最小个数的正整数去表示1 − n 1-n1−n中的所有数。

联系到经典的贴邮票问题,n nn的范围1 0 3 10^3103,想到搜索。

每次搜索,都尝试在已经选择的数后再添加一个更大的数,设已选择数列的最大值为m a x maxmax,可以组成的最大的数为s u m sumsum,已经选了n u m numnum个数。

枚举下一个数i的范围[ m a x + 1 , s u m + 1 ] [max+1,sum+1][max+1,sum+1],容易得到,添加数后s u m sumsum应改为s u m + i sum+isum+i.

简而言之:

dfs(num,sum,max)

for i

dfs(num+1,sum+i,i)

2020.8.5

P1641 [SCOI2010]生成字符串

考察:卡特兰数

卡特兰数应用的经典例题。

详细见:卡特兰数,折线定理。

这里给出公式:( m n + m ) − ( m − 1 n + m ) \dbinom{m}{n+m}−\dbinom{m-1}{n+m}(n+mm​)−(n+mm−1​)。

详细证明见百度

P1492 猩猩散步

考察:组合数

式子很好列,关键是答案的输出。

肯定是要用到高精(python)

这里我们考虑一种非常朴素的计算答案的方法。

对组合数进行约分

如何约分?

对1 − m + n 1-m+n1−m+n的所有数进行素因数分解(其实只需要一个最小质因数的值)

若在分子上,就将这个素因数的出现次数+1,若在分母上,出现次数-1.最后把所有的素因数乘起来,高精100位数组即可。

2020.8.6

P1005 矩阵取数游戏

考察:区间DP,高精

容易想到,对于每一行取数的最大值,等于先取左边数与先取右边数的较大值。

因此运用区间DP。

转移方程:

d p [ k ] [ k + j ] = m a x ( 2 ∗ d p [ k + 1 ] [ k + j ] + 2 ∗ g r i d 1 [ i ] [ k ] , 2 ∗ d p [ k ] [ k + j − 1 ] + 2 ∗ g r i d 1 [ i ] [ k + j ] ) dp[k][k + j] = max(2 * dp[k + 1][k + j] + 2 * grid1[i][k], 2 * dp[k][k + j - 1] + 2 * grid1[i][k + j])dp[k][k+j]=max(2∗dp[k+1][k+j]+2∗grid1[i][k],2∗dp[k][k+j−1]+2∗grid1[i][k+j])

其中d p [ i ] [ j ] dp[i][j]dp[i][j]为i − j i-ji−j列取数的最大值,g r i d 1 [ i ] [ j ] grid1[i][j]grid1[i][j]为矩阵上a i , j a_{i,j}ai,j​的值。

对于每一行分别处理再相加即可。

至于高精,重载运算符后正常算就好。

P1278 单词游戏

考察:搜索

看到这个N的范围就知道用搜索了。

先预处理每个单词能往后接的所有单词,用向量存一下。

然后大力搜,枚举每一个单词作为开头的单词。

注意:

对于每一个搜索到的状态压缩存储起来,空间复杂度是O ( 2 N ) O(2^ N)O(2N),时间复杂度O ( 2 N ) O(2^ N)O(2N).

2020.8.7

P2261 [CQOI2007]余数求和

考察:数论分块

k ( m o d i ) k \pmod ik(modi)的形式难以计算,考虑最朴素的转化方式。

k ( m o d i ) = k − ⌊ ( k i ) ⌋ ∗ i k \pmod i = k - \lfloor(\frac{k}{i}) \rfloor*ik(modi)=k−⌊(ik​)⌋∗i

右边的式子直接数论分块愉快AC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值