【LOJ3074】「2019 集训队互测 Day 3」操作序列计数

该博客主要解析了LOJ3074题目的解题思路,重点在于如何计算2号操作不超过特定次数的方案数。通过使用动态规划(DP)方法,从高位到低位处理,利用min{i,j}+2的性质优化了计算过程,将时间复杂度降低到O(K^2 * Log^3N),并提供了问题的解决方案。" 127593135,8339497,使用RecyclerView实现Android手风琴效果,"['Android开发', 'RecyclerView', 'Java', 'UI设计', 'Android Studio']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

【思路要点】

  • 考虑计算 2 2 2 号操作不超过 i i i 次的方案数。
  • 它应当等于 2 2 2 k 0 k^0 k0 的倍数、 1 1 1 k 1 k^1 k1 的倍数、 1 1 1 k 2 k^2 k2 的倍数、……、 1 1 1 k i k^i ki 的倍数总和为 N N N 的方案数,从高位向低位 d p dp dp ,那么第 j j j 位可以填数的位置数应当为 m i n { i , j } + 2 min\{i,j\}+2 min{ i,j}+2 ,保留余数不超过 ( i + 2 ) k (i+2)k (i+2)k 的状态即可。
  • 上述做法需要进行 O ( L o g N ) O(LogN) O(LogN) d p dp dp ,但压位后已经可以通过。
  • 注意到 m i n { i , j } + 2 min\{i,j\}+2 min{ i,j}+2 j j j 较小时只与 j j j 有关, j j j 较大时的 d p dp dp 值就是隔板法形成的组合数,可以避免进行 O ( L o g N ) O(LogN) O(LogN) d p dp dp ,改为从低位向高位进行一次 d p dp dp
  • 不计高精度运算的时间复杂度为 O ( K 2 L o g 3 N ) O(K^2Log^3N) O(K2Log3N)

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 55;
const int MAXNK = 605;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {
    
    x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {
    
    x = min(x, y); } 
template <typename T> void read(T &x) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值