洛谷P2602|bzoj1833 [ZJOI2010]数字计数 数位dp

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

数位dp先预处理啊,然后xjb乱搞一下啊

好吧其实我还是看了一下题解。。一开始弄错了统计的方法。。于是疯狂wa

有关数位dp的文章的话,传送门:http://blog.csdn.net/wust_zzwh/article/details/52100392,当然是这位大犇写的了%%%%(虽然百度也可以找到)

代码(有抄题解嫌疑的我):

//Decision's template
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<set>
using namespace std;

#define DP_maxn 16
#define maxn 100000
#define INF 10000007
#define mod 1000000007
#define mst(s,k) memset(s,k,sizeof(s))

typedef long long ll;

struct Edge{
    int from,to,dist;
    Edge(int u,int v,int d):from(u),to(v),dist(d){}
};

ll dp[20][20][20],d[20],ans[20],t[20],g[20],f[20];       

/*-------------------------------template End--------------------------------*/

void init()
{
    mst(dp,0);
	t[1] = 1;
	for(int i = 0;i<=9;i++) dp[1][i][i]  = 1;
	for(int i = 2;i<=15;i++) t[i] = t[i-1]*10;
	for(int i = 2;i<=13;i++)
	{
		for(int j = 0;j<=9;j++) 
		{
			for(int k = 0;k<=9;k++)
			{
				for(int l = 0;l<=9;l++) 
				    dp[i][k][l] += dp[i-1][j][l];
				dp[i][k][k] += t[i-1];
			}
		}
	}
}


void solve(ll x,ll *tmp)
{
	for(int i = 0;i<=9;i++) tmp[i] = 0;
	int len = 15;
	if(!x) {tmp[0] = 1;return ;}
	while(t[len]>x) len--;
	for(int i = 1;i<len;i++)
	{
		for(int j = 1;j<=9;j++)
		{
			for(int k = 0;k<=9;k++)
			{
				tmp[k] += dp[i][j][k];
			}
		}
	}
	int cur = x/t[len];
	tmp[0]++;
	for(int i = 1;i<cur;i++) 
	    for(int k = 0;k<=9;k++)
	        tmp[k] += dp[len][i][k];
	x%=t[len];
	tmp[cur] += x+1;
	for(int i = len-1;i;i--)
	{
	    cur = x/t[i];
	    for(int j = 0;j<cur;j++)
	        for(int k = 0;k<=9;k++)
	            tmp[k]+=dp[i][j][k];
	    x%=t[i];
	    tmp[cur] += x+1;
	}
}

ll x,y;

int main()
{
    //freopen("std.in","r",stdin);
    //freopen("std.out","w",stdout);
    init();
    cin>>x>>y;
    solve(y,f);
    solve(x-1,g);
    for(int i = 0;i<9;i++) cout<<f[i]-g[i]<<" ";
    cout<<f[9]-g[9]<<endl;
    return 0;

}

VS2010“未能正确加载包”问题解决方法小汇 本文按照由简至繁的顺序详述了借助网络获知的四种解法,主要面向重装 VS2010 后遭遇题述问题的网友,相关包尤指 VSTS、RadLangSvc、Language、Bootstrap 及 MicrosoftDataEntityDesign。 阅读详情

相关推荐

微前端实战:MicroApp内存泄漏优化策略与性能调优

本文分享了在大型后台管理系统微前端化过程中,使用MicroApp框架时遇到的内存泄漏实战问题与优化策略。通过深入分析沙箱机制,提出动态加载、精准卸载、沙箱配置优化及第三方库补丁等核心方案,并结合Vue/React子应用专项检查清单,有效解决了内存占用飙升问题,为微前端架构的性能调优提供了系统性解决方案。

weixin_29014939的博客 256

P2602数位DP

### P2602 题目链接 ### 题目大意:给你一个区间,问你区间所有数字中,0、1、2 .... 9 的个数的总和分别为多少。 分析: 枚举 0 ~ 9 进行数位 DP 即可。 注意记忆化搜索:必须要用到第二维来表示,前 1 ~ pos 位,某个数(0 ~ 9)的个数。 例如,我们在求这个区间中 2 的个数,直接看的话,后 pos 位 的 2 的个数好像...

diefen9380的博客 271

从UART到RS485:手把手教你用SIT3485E收发器搞定工业级通信(含原理图与PCB布局要点)

本文详细解析了从UART到RS485的工业级通信转换,重点介绍了SIT3485E收发器的原理图设计、PCB布局要点及抗干扰技巧。通过差分信号传输和优化电路设计,实现长距离、多设备稳定通信,适用于工业自动化等复杂环境。

weixin_29169505的博客 317

P2602 [ZJOI2010]数字计数 数位DP(记忆化搜索)

P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。 输入输出格式 输入格式:   输入文件中仅包含一行两个整数a、b,含义如上所述。   输出格式:   输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。   输入输出样例 输入样例#1: 复制 1 99 ...

小屋 522

P2602 [ZJOI2010] 数字计数 题解 数位dp

数位dp 动态规划 深度优先搜索 记忆化搜索 题解 C++代码 附详细注释

一只摸鱼的bbc 1585

数位DP(循环迭代)】P2602 [ZJOI2010]题解分析

1、对于12345,第一层外循环i=len时仅处理了10000内的数,而剩余的2345没有处理。贴着上界时,后面就只能取。内的数的统计,计算了2345+1个最高位1的次数,剩余12345-10000=2345没有统计。内的数的统计,计算了345+1个最高位2的次数,剩余2345-2000=345没有统计。内的数的统计,计算了45+1个最高位3的次数,剩余345-300=45没有统计。内的数的统计,计算了5+1个最高位4的次数,剩余45-40=5没有统计。内的数的统计,计算了1个最高位5的次数,完成统计。

Jundifang的博客 1903

【Luogu】P2602 [ZJOI2010] 数字计数 (数位DP)

根据数位DP的思想,我们可以将答案分成多个限制来求,本题中的答案是每个数码的个数,一次新求出所有个数,那我们可以考虑每次单独求一个数码。那么 dfs 过程中就要前导零的影响,如果我们当前要求 0 那么还需要特判,同时还需要传递 sum,即遇到指定数码的个数。具体实现看代码,主要难点在于知道这里要利用数位DP求出每一位的数量,即拆开一个一个求,同时还需要考虑前导零。所以定义记忆化搜索 dp[i][j] 代表处理 i 位后且当前所求数码是 j 的数量。本题我们要求 a ~ b 中每个数码出现了多少次。

qq_61422664的博客 376

2018.10.15【BZOJ1833】【P2602】【ZJOI2010数字计数数位DP

BZOJ传送门 传送门 解析: 感觉不是一个很好做的数位DP。 思路: 我其实是看了hzwerhzwerhzwer的题解才会这道题的非递归写法,结构体重载运算符大法好啊orzorzorz。 定义数组f[i][j][k]f[i][j][k]f[i][j][k]表示位数为iii,最高位为jjj,有数字kkk的个数。 其中最后一维kkk可以...

anlongyi8087的博客 70

【luogu2602】【bzoj1833】 [ZJOI2010]数字计数 [数位dp]

P2602 [ZJOI2010]数字计数 bzoj1833 套用的写windy数时的数位dp模板 emmm其实还有很多种做法 f[i][j][k]表示填了i位数其最高位数字为j时数码k出现了多少次 注意在 和x的位数相同有一位比x的对应位数小的全部方案数 其余位数对应数字都相同 的时候要再统计一下前面的数用了多少次 有i位数字的情况下 如果不考虑前导0,对于每一个数它们的数量都是相等的,...

weixin_30348519的博客 166

·bzoj·[ZJOI2010]数字计数

初见安~这里是两个传送门:P2602 & bzoj P1833 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次 输入格式: 输入文件中仅包含一行两个整数a、b,含义如上所述。 输出格式: 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。 输入样例: 1 99 输出样例: 9 20 20 ...

樱狸✨愿携清风归来处 254

BZOJ1833: [ZJOI2010]count 数字计数P2602

乱搞 BZOJ题目传送门 题目传送门 把题目转化成求1到n的出现次数。设f[i]f[i]f[i]表示第iii位出现的总次数,那么有f[i]=f[i−1]∗10+10i−1f[i]=f[i-1]*10+10^{i-1}f[i]=f[i−1]∗10+10i−1(先不管前导0)。 我们对n的每一位进行处理。对于第iii位,没有到达边界的数字答案即为10i−1+f[i−1]∗a[i]10^{i-1}+...

forezxl的博客 291

数位DP P2602 [ZJOI2010]数字计数 P2657 [SCOI2009] windy 数

P2602 [ZJOI2010]数字计数 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <queue> #include <vector> #include &l

wldcmzy的博客 269

P2602 [ZJOI2010] 数字计数 数位DP裸题

题目链接:传送门 题面 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a、b,含义如上所述。 输出格式: 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。 输入输出样例 输入样例#1: 1 99 输出样例#1: 9 20 20 20 20 20 20 20 20 2...

The_OIer的博客 2752

P2602:[ZJOI2010] 数字计数数位DP

特别注意,依据递推公式 f[i]=f[i-1]*10+10^(i-1) 计算出的结果,是含前导 0 的结果,后续操作需做处理。

hnjzsyjyj的专栏 951

P2602 [ZJOI2010]数字计数

P2602 [ZJOI2010]数字计数 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。 Solution 一眼识数位dp 以 \(dp[i][j]\) 对某个指定的数码, 填了 \(i\) 位, 其中有 \(j\) 位填了特定数码的 总数码数 然后分一下前导零, 最高位, 数位dp即可 看代码 Code #include<iostream>...

weixin_30551963的博客 133

P2602 [ZJOI2010]数字计数 (题解+代码)

题目传送门: 题解: 数位dp 对于每个数(0~9)进行一次数位dp 由于 前面的数码出现的次数 会影响到最后结果 所以将 前面的数码出现的次数 设为dp的第二维状态 然后记录对应结果,输出相减值即为答案 代码及注释如下: #include<iostream> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll a[20],dp[20][20],ans[3][

Lesords 880

[3768]简单的数学题

题目链接:https://www.luogu.org/problemnew/show/P3768 看到\(\gcd\)我们就来套路一波,枚举因数可得 \[\sum\limits_{d=1}^nd^3\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{n}{d}\rfloor}ij[\gc...

a5163273的博客 217

[luogu2602 ZJOI2010] 数字计数 (数位dp)

[luogu2602 ZJOI2010] 数字计数 (数位dp) 传送门 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。 Input 输入文件中仅包含一行两个整数a、b,含义如上所述。 Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。 Samp...

Tricksterism 223

bzoj1833

hh 1 #include<cstdio> 2 #include<cstring> 3 #include<ctime> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdlib> 7 #include<iostream>...

weixin_33778778的博客 237

luogu2602 [ZJOI2010]数字计数 两解

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+5; 4 long long a,b; 5 long long ansa[15],ansb[15]; 6 int tot,e[15]; 7 long long c[15],d[15]; 8 template&l...

weixin_30790841的博客 128

luogu2602数字计数

题目给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。(很简短的题面,难度是省选/NOI-)数位DP        (1)分情况,逐位讨论。        (2)模型:计算在[L,R]中有多少个数满足条件。        (3)套路:将问题转化为[1,R]-[1,L-1],只需回答[1,X]的询问即可。思路    1.算出[1,X]:        (1)按...

西泠 374
上一篇: 洛谷 P1262|P2341|P2002 强连通分量,缩点
下一篇: 洛谷 P3389 【模板】高斯消元法
Decision2016
博客等级 码龄10年 3粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值