首页 > 其他分享 >DPS Digit Sum

DPS Digit Sum

时间:2023-11-22 16:55:52浏览次数:25  
标签:10 Digit DPS int Sum include flg mod

题意

求 \(1 \to n\) 中有多少个数是 \(d\) 的倍数。

\(n \le 10 ^ {10000}\)。

Sol

数位 dp,设 \(f_{i, j, 1 / 0}\) 表示第 \(i\) 位,膜 \(d\) 等于 \(j\),是否贴住上限。

转移是 \(trivial\) 的。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <string>
#include <cstring>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

/* #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++) */
/* char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf; */

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
const int N = 1e4 + 5, M = 105, mod = 1e9 + 7;
char strbuf[N];
string s;

int f[N][M][2];

void Mod(int &x) {
	if (x >= mod) x -= mod;
	if (x < 0) x += mod;
}

void dfs(int x, int k, bool flg, int n, int d) {
	if (~f[x][k][flg]) return;
	if (!x) {
		if (!k) f[x][k][flg] = 1;
		else f[x][k][flg] = 0;
		return;
	}
	f[x][k][flg] = 0;
	int ed = 9;
	if (flg) ed = s[x] - '0';
	for (int i = 0; i <= ed; i++) {
		int _k = (k + i) % d;
		dfs(x - 1, _k, flg && i == ed, n, d);
		f[x][k][flg] += f[x - 1][_k][flg && i == ed], Mod(f[x][k][flg]);
	}
}

signed main() {
	memset(f, -1, sizeof(f));
	scanf("%s", strbuf);
	s = strbuf;
	int n = s.size(), d = read();
	reverse(s.begin(), s.end());
	s = "0" + s;
	dfs(n, 0, 1, n, d);
	write((f[n][0][1] - 1 + mod) % mod), puts("");
	return 0;
}

标签:10,Digit,DPS,int,Sum,include,flg,mod
From: https://www.cnblogs.com/cxqghzj/p/17849726.html

相关文章

  • 09-基础SQL-DQL(数据查询语言)-聚合函数(count、max、min、avg、sum)
    DQL-介绍(常用)DQL英文全称是DataQueryLanguage(数据查询语言),数据查询语言用来查询数据库中表的记录查询关键字:SELECTDQL-语法......
  • error:0308010C:digital envelope routines::unsupported问题解决
    问题描述:报错:Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制报错详细信息:解决方案:方案1:打开IDEA终端,直接输入Linux&MacOS:exportNODE_OPTI......
  • vue前端项目启动报错:error:0308010C:digital envelope routines::unsupported
    问题描述使用 npmrundev 或者 yarnrundev 时报错:error:0308010C:digitalenveloperoutines::unsupported解决方案修改package.json,在相关构建命令之前加入setNODE_OPTIONS=--openssl-legacy-provider"scripts":{"dev":"setNODE_OPTIONS=--openssl-legacy-provide......
  • go.mod: checksum mismatch 报错解决办法
    来源:http://www.shanhubei.com/archives/2842.html升级go.mod依赖版本之后会报错。go.mod里的依赖项版本号升级之后,本地下载的缓存并没有清理掉还是旧的版本,所以把gomod缓存清理掉然后删掉gosum重新生成。goclean-modcachermgo.sum......
  • 【题解 CF1628D2】 Game on Sum
    GameonSum(HardVersion)题面翻译Alice和Bob正在玩一个游戏,游戏分为\(n\)个回合,Alice和Bob要轮流对一个数\(x\)进行操作,已知这个数初始值是\(0\)。具体每个回合的行动规则如下:Alice选择一个在区间\([0,k]\)之间的实数\(t\)。Bob可以选择让\(x\)变成\(......
  • How to use SUM and DINSTINCT with GreenDao?
    HowtouseSUMandDINSTINCTwithGreenDaoquerybuilder?AskQuestionAsked 7yearsagoModified 6years,7monthsagoViewed 1ktimes Partof MobileDevelopment Collective Reportthisad2Iwanttogetthesumoftotalrowsinac......
  • 若依vue启动报Error: error:0308010C:digital envelope routines::unsupported
    解决:若依vue启动报Error:error:0308010C:digitalenveloperoutines::unsupported1.描述:问题产生原因是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方法:有很多种,我把适合我的写在第一......
  • [ARC107F] Sum of Abs 题解
    题意给定一个\(N\)个点,\(M\)条边的简单无向图,每个节点有两个值\(A_i\)和\(B_i\)。现对于每个节点,均可以选择花费\(A_i\)的代价将其删去或保留节点。若一个节点被删除,那么所有与其向连的边也会被删除。定义一个极大联通块的权值为联通块内所有节点的\(B_i\)的和的绝对......
  • [USACO23FEB] Equal Sum Subarrays G 题解
    [USACO23FEB]EqualSumSubarraysG题解题目链接\(O(n^5)\)暴力显然,如果修改\(a_i\)的值,只会影响包含\(a_i\)的区间的区间和。于是对于每个\(a_i\),可以将所有区间分成两类,即包含\(a_i\)的区间和不包含\(a_i\)的区间。这两种区间的区间和中最小的差值即为答案。......
  • 2023 Nov. Week-2 Summary
    2023Nov.Week-2Summary2023.11.06-2023.11.12(椰树牌椰汁!)学习内容学了基础算法(补题ing高维前缀和各种贪心的练最小度限制生成树基本的推狮子动态规划树形DP,换根DPwqs二分如学(需要复习/做题)数据结构回滚莫队,二次离线动态规划......