AtCoder Beginner Contest 336 E题 Digit Sum Divisible

2024-05-08 07:36

本文主要是介绍AtCoder Beginner Contest 336 E题 Digit Sum Divisible,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

E题:Digit Sum Divisible

标签:数位 d p dp dp
题意:给定一个 n n n,求小于等于 n n n的数中有多少个能被自己的位数之和整除。( 1 < = n < = 1 0 14 1<=n<=10^{14} 1<=n<=1014
**题解:**数位 d p dp dp模版题, d p [ p o s ] [ s u m ] [ m o d ] dp[pos][sum][mod] dp[pos][sum][mod]表示当第 p o s pos pos位各位数字之和为 s u m sum sum除原数的余数是 m o d mod mod且有没超出边界时候的个数。
代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll n, m, cnt = 0;
// dp[i][j][k]: 第i位 当前数字和为j 取模结果为k的个数
ll a[20], dp[20][10*20][10*20];ll dfs(ll pos, ll sum, ll mod, ll flag) {if (sum > m) return 0;if (pos == 0) return sum == m && mod == 0;if (!flag && dp[pos][sum][mod] != -1) return dp[pos][sum][mod];ll x = flag ? a[pos] : 9;ll ans = 0;for (ll i = 0; i <= x; i++) {ans += dfs(pos - 1, sum + i, (mod * 10 + i) % m, flag && (i == a[pos]));}if (!flag) dp[pos][sum][mod] = ans;return ans;
}int main() {cin >> n;while (n) {a[++cnt] = n % 10;n /= 10;}ll res = 0;for (int i = 1; i <= 9 * cnt; i++) {m = i;memset(dp, -1, sizeof(dp));res += dfs(cnt, 0, 0, 1);}cout << res;return 0;
}

这篇关于AtCoder Beginner Contest 336 E题 Digit Sum Divisible的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969707

相关文章

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub