首页 > 其他分享 >CodeStar2022年秋第9周周赛普及奠基组

CodeStar2022年秋第9周周赛普及奠基组

时间:2022-12-10 00:11:32浏览次数:81  
标签:const CodeStar2022 周周赛 int 年秋 operator return mint mod

T1: k的幂分拆

本题难度中等,完全背包模板题,以 \(k\) 的幂作为物品大小

dp[i][j] 表示使用若干个 \(k^0 \sim k^i\),相加恰好为 \(j\) 的方案数

转移:

\( dp[i][j] = dp[i-1][j] + dp[i][j-k^i] \)

假设 \(n\) 是满足 \(k^n \leqslant m\) 的最大值,时间复杂度就是 \(O(nm)\)
这里 \(n \leqslant 20\)

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

//const int mod = 998244353;
const int mod = 1000000007;
struct mint {
    ll x;
    mint(ll x=0):x((x%mod+mod)%mod) {}
    mint operator-() const {
        return mint(-x);
    }
    mint& operator+=(const mint a) {
        if ((x += a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator-=(const mint a) {
        if ((x += mod-a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator*=(const mint a) {
        (x *= a.x) %= mod;
        return *this;
    }
    mint operator+(const mint a) const {
        return mint(*this) += a;
    }
    mint operator-(const mint a) const {
        return mint(*this) -= a;
    }
    mint operator*(const mint a) const {
        return mint(*this) *= a;
    }
    mint pow(ll t) const {
        if (!t) return 1;
        mint a = pow(t>>1);
        a *= a;
        if (t&1) a *= *this;
        return a;
    }

    // for prime mod
    mint inv() const {
        return pow(mod-2);
    }
    mint& operator/=(const mint a) {
        return *this *= a.inv();
    }
    mint operator/(const mint a) const {
        return mint(*this) /= a;
    }
};
istream& operator>>(istream& is, mint& a) {
    return is >> a.x;
}
ostream& operator<<(ostream& os, const mint& a) {
    return os << a.x;
}

int p[20];
mint dp[100005];

int main() {
    int m, k;
    cin >> m >> k;
    
    int n = 0;
    p[n] = 1;
    while (p[n]*k <= m) {
        p[n+1] = p[n]*k;
        ++n;
    }
    
    dp[0] = 1;
    rep(i, n+1) {
        for (int j = p[i]; j <= m; ++j) {
            dp[j] += dp[j-p[i]];
        }
    } 
    
    cout << dp[m] << '\n';
    
    return 0;
}

标签:const,CodeStar2022,周周赛,int,年秋,operator,return,mint,mod
From: https://www.cnblogs.com/Melville/p/16970580.html

相关文章

  • CodeStar2022年秋第9周周赛普及奠基组
    T1:矩阵涂色本题难度简单,考察二维数组的基本使用。矩阵最终状态中,如果某一行全是红色,说明最后一次操作是R操作,如果某一列全是蓝色,说明最后一次操作一定是B操作代......
  • CodeStar2022年春第十一周周赛普及奠基组
    T1:牛奶供应本题难度简单,主要考察贪心算法。第\(i\)天的牛奶成本价为\(\min(c_i,minp+s)\),其中\(minp\)为前\(i-1\)天中牛奶的最低成本价代码实现#include<bit......
  • CodeStar第八周周赛普及进阶组
    T1:垃圾游戏3本题难度中等,一道稍有变化的01背包题。一般的01背包是考虑每个物品取和不取,本题是考虑每个物品带走(相当于取)还是分解(相当于不取),如果分解,也会贡献相应价值记d......
  • CodeStar第七周周赛普及进阶组
    T1:四次方的和给出\(n\)个正整数\(a_1,~a_2,~\cdots,~a_n\)。选择其中总和不超过\(m\)的若干数,每个数只能选\(1\)次,选出的数的\(4\)次方之和最大是多少?限制:\(1......
  • CodeStar第六周周赛普及进阶组
    T1:倍数序列3本题难度中等,思路和LIS类似,用dp[i]表示以\(a_i\)结尾的倍数序列的个数。如果\(a_i\)是\(a_j\)的倍数,倍数序列个数就是\(dp[j]\),枚举所有\(j\)求......
  • 石家庄铁道大学2022年秋季开学考试总结
     java开学第一节课,我们亲爱的建民老师给我们准备了一套题目,在暑假时我们已经自学了一部分内容,但是突如其来的考试还是让我乱了阵脚,主要是熟练度不高,只完成了一些基础的项......
  • CodeStar第五周周赛
    T1:复合逻辑表达式本题难度中等,线性\(dp\)问题。根据最后一个运算递推:如果是AND,需要两边都是true;如果是OR,只需任意一个是true当S[i]='AND'y[i-1]=T且x[i]=T:......
  • 壬寅年秋天的最后一天
    今天早上,我亲爱的奶奶安静的离开了这个世界,弥留之际,她已经好多天无法说话了,无法吃饭。我最后一次见到奶奶是50天前的9月17号,她还能和我聊天,说她想去扬州看看,可惜腿脚不好,她......
  • 【杂谈】如何让2020年秋招CV项目能力更加硬核,可深入学习有三秋季划4大领域32个方向
    为了让大家在深度学习与计算机视觉方向上掌握更多硬核的项目能力,以便应对秋季招聘,有三AI秋季划准备了4个小组,每一个小组有8个方向,供大家深入学习。当你在某一个领域里做到极......
  • 2022年秋招随想
      很久没有更新博客了,一直忙着实习和秋招,现在算是告一段落了,结局不算好也不算坏,但一路走来我一直觉得自己属于运气挺好的那一类人。 首先很感谢高中同学的客户端劝进......