首页 > 其他分享 >P2602

P2602

时间:2024-09-19 19:23:39浏览次数:9  
标签:cnt 20 ten int long num P2602

新鲜出炉的数位dp

#include<bits/stdc++.h>
using namespace std;
long long a,b;
long long ten[20],f[20];
long long cnta[20],cntb[20];
void solve(long long x,long long *cnt) {
	long long num[20]= {0};
	int len=0;
	while(x) {
		num[++len]=x%10;
		x=x/10;
	}
	for(int i=len; i>=1; i--) {
		for(int j=0; j<=9; j++)
			cnt[j]+=f[i-1]*num[i];
		for(int j=0; j<num[i]; j++)
			cnt[j]+=ten[i-1];
		long long num2=0;
		for(int j=i-1; j>=1; j--) {
			num2=num2*10+num[j];
		}
		cnt[num[i]]+=num2+1;
		cnt[0]-=ten[i-1];
	}
}
int main() {
	scanf("%lld %lld",&a,&b);
	ten[0]=1;
	for(int i=1; i<=15; i++) {
		f[i]=f[i-1]*10+ten[i-1];
		ten[i]=10*ten[i-1];
	}
	solve(a-1,cnta);
	solve(b,cntb);
	for(int i=0; i<=9; i++)printf("%lld ",cntb[i]-cnta[i]);
}

标签:cnt,20,ten,int,long,num,P2602
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18421203

相关文章

  • P2602 [ZJOI2010] 数字计数 题解
    数位dp的板子题?显然\([a,b]\)等价于\([0,b]-[0,a]\)。考虑\(dp_{i,j}\)表示到第\(i\)位数字\(j\)的答案。先不考虑数字大小限制(即1到999之类),则显然有\(dp_{i,j}=dp_{i-1,j}\times10+10^{i-1}。当前数字是0时则减去10^{i-1},再减去1。\)所以我们可以预处理出\(dp\),来表示后面......
  • P2602 数字计数 题解
    QuestionP2602数字计数求\([a,b]\)中的所有整数中,每个数出现的次数Solution数位DP板子题定义\(dp[i]\)表示\(i\)位数的每种数字有多少个,我们把\(0\)和\(00\)看成两种不同的数,并且\(00\)中算\(0\)出现过两次显然,\(0\sim9\)在\(i\)位数中出现的次数是一样......
  • P2602 [ZJOI2010] 数字计数&HDU 2089 (数位dp)
    luoguHDU最近在复习数位dp数位dp,就是在一些计数问题的时候按照一位一位的顺序依次计算,通常可以采用记忆化搜索的方式这两道题就是很典型的数位dp数位dp通常要记录是不是顶着上限,有没有前导零,到了哪一位以及一些特殊的条件要求。数位dp通常要把某个区间的问题转变成两个区间......
  • P2602 [ZJOI2010] 数字计数:数位DP
    https://www.luogu.com.cn/problem/P2602//#include<iostream>//#include<iomanip>//#include<unistd.h>//#include<climits>//#include<string>//#inclu......
  • P2602 [ZJOI2010] 数字计数
    P2602[ZJOI2010]数字计数-洛谷|计算机科学教育新生态(luogu.com.cn)数位DP模板题由于是对0~9进行统计,所以我们只需对每一个数进行数位DP即可不过对于0和1~9还是......
  • P2602 [ZJOI2010] 数字计数
    Idea可以模仿我们人类分类讨论的时候做的事情,并且加以记忆化,这样就可以完成.Code#include<bits/stdc++.h>usingnamespacestd;#defineMAXN16#defineF(i,a,......