首页 > 其他分享 >abc336 E - Digit Sum Divisible 题解 数位DP

abc336 E - Digit Sum Divisible 题解 数位DP

时间:2024-01-15 19:23:16浏览次数:51  
标签:Digit le 好数 Divisible 题解 long int limit 数位

题目链接:https://atcoder.jp/contests/abc336/tasks/abc336_e

题目大意:

我们定义一个整数 \(n\) 的 数位和 为 \(n\) 的十进制表示中的各位上的数字之和。比如:整数 \(2024\) 的数位和为 \(2 + 0 + 2 + 4 = 8\)。

一个正整数 \(n\) 被称作一个 好数 如果 \(n\) 能被它的数位和整除。举例,\(2024\) 是好数,因为它能被它的数位和 \(8\) 整除。

给你一个整数 \(N(1 \le N \le 10^{14})\),请你计算有多少 \(\le N\) 的好数。

输入 \(N\),输出 \(\le N\) 的好数个数。

解题思路:

枚举数位和 \(X\)(\(X\) 最大也就 \(14 \times 9\)),然后对于每一个 \(X\),做一遍数位DP。

定义状态 \(f_{p, x, y}\) 表示当前在第 \(p\) 位,到第 \(p\) 位为止的数模 \(X\) 为 \(x\),到第 \(p\) 位为止的数的数位和为 \(y\) 对应的数字个数。

则最终(边界条件)只有当 \(p = -1\) 时,只有 \(x = 0\) 且 \(y = X\) 的状态对应的个数为 \(1\)。

示例程序:

#include <bits/stdc++.h>
using namespace std;

int a[22], X;
// f[p][x][y] 第 p 为,模 X = x,数位和 y
long long N, ans, f[22][140][140][2];
bool vis[22][140][140][2];

long long dfs(int p, int x, int y, bool limit) {
    if (p < 0) {
        return x == 0 && y == X;
    }
    if (vis[p][x][y][limit]) return f[p][x][y][limit];
    vis[p][x][y][limit] = true;
    long long &res = f[p][x][y][limit];
    res = 0;
    int up = limit ? a[p] : 9;
    for (int i = 0; i <= up; i++) {
        int xx = (x * 10 + i) % X, yy = y + i;
        res += dfs(p-1, xx, yy, limit && i == up);
    }
    return res;
}

long long cal(long long num) {
    memset(vis, 0, sizeof vis);
    int p = 0;
    while (num) {
        a[p++] = num % 10;
        num /= 10;
    }
    return dfs(p-1, 0, 0, 1);
}

int main() {
    scanf("%lld", &N);
    for (X = 1; X <= 14 * 9; X++)
        ans += cal(N);
    printf("%lld\n", ans);
    return 0;
}

标签:Digit,le,好数,Divisible,题解,long,int,limit,数位
From: https://www.cnblogs.com/quanjun/p/17966110

相关文章

  • CF1818B ndivisible 题解
    题意简述构造一个长度为\(n\)的排列\(A\),使得对于任意的\(l,r\)(\(1\lel<r\len\))都满足\(A_l+A_{l+1}+⋯+A_r\)不可以被\(r-l+1\)整除。输出其中一种合法排列即可。解题思路构造题。考虑对\(n\)进行分类讨论:当\(n=1\)时,由样例即可得合法排列为\(1\)......
  • P6021 洪水 题解
    请先完成ddp模板一个ddp讲解视频Part0:题意解释感觉题面太阴间了。所以解释一下:Cxt表示把\(x\)结点的权值改为\(t\).Qx:把\(x\)子树中一些结点删去,使得\(x\)与\(x\)子树内所有叶子结点不连通。求删去的结点权值和的最小值。Part1:先不考虑修改操作发现原......
  • electron安装卡住问题解决
    问题安装electron会卡住,你换镜像,挂梯子都没有用。解决办法自己配置下载electron二进制文件的地址解决步骤npmconfigls进入该配置文件,手动添加ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/electron_mirror=npm.taobao.org这两行重新npminstallele......
  • Codeforces Round 919 (Div. 2)(A~D) 题解
    CodeforcesRound919(Div.2)(A~D)题解A.SatisfyingConstraints题意:给你一些条件让你求出满足条件的整数有多少个。模拟即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllMAXN=2e5+5;llTex=1,n;voidAC(){ cin>>n; lll=......
  • element-forge在Linux Centos中打包构建时遇到的异常问题解决方案
    环境:LinuxCentOS8x64electron:27.1.0electron-forge:7.1.0electrondev依赖包"devDependencies":{"@electron-forge/cli":"^7.1.0","@electron-forge/maker-deb":"^7.1.0","@electron-forge/maker-rpm&quo......
  • P10058 Reverse and Rotate题解
    简单题意一共3个操作:rev:将字符串翻转。>\(x\):将后面\(x\)个字母移到前面。<\(x\):将前面\(x\)个字母移到后面。解法解法一看到#1到#3的范围可以打出暴力程序,按题意模拟,时间复杂度\(O(n|S|)\)。预计\(30\)pts。解法二很明显,第二个操作和第三个操作有点像......
  • P9816 少项式复合幂 题解
    题目链接:少项式复合幂注意到题目的模并不是很大,我们考虑两个核心的性质。\(f(f(x))\bmodp=f(f(x)\bmodp)\bmodp\),证明直接代入\(f(x)\)进去得到:\(f(f(x))=a_0\timesf^0(x)+a_1\timesf^1(x)...+a_n\timesf^n(x)\bmodp=\)\[\sum_{i=0}^{n}a_i\timesf^{i}(x)\b......
  • P5501 [LnOI2019] 来者不拒,去者不追 题解
    题目链接:来者不拒,去者不追直接在线查询题目所给的式子是很困难的,我们考虑单点考察贡献。对于一个已经确定的式子,我们发现加入一个数或者删除一个数的贡献如图所示:如图所示,在原有的序列为\((1,2,3)\)当中,我们加入新的\(2\)进去,我们观察到每个数的贡献的变化是这样,比\(2\)......
  • 题解 P7169 [eJOI2020 Day1] Exam
    传送门。题意有两个长度为\(N\)的数列\(A_i\),\(B_i\)。可以对\(A\)数组进行若干次操作,每次可以使\(A_i\)到\(A_j\)中的所有数变成期间的最大值,求最多能使多少个数满足要求。分析显然,要使我们的某一个\(A_x\)变成\(B_x\),至少会包含\(A_{L_x}\)或\(A_{R_x}\),\(L_......
  • P5321 [BJOI2019] 送别 题解--zhengjun
    由于大家的做法需要大量分类讨论和代码量,这里提供一种不怎么分类的,容易实现的做法。首先,由于墙体会随时变化,所以直接对墙体本身维护不是很方便。我们可以牺牲一点常数,对\((i,j)\)建立四个点\(UL_{i,j},UR_{i,j},DL_{i,j},DR_{i,j}\)分别表示\((i-\varepsilon,j-\varepsilo......