看完这道题再来说难度吧!

P2602 [ZJOI2010] 数字计数

裸数位 dp 评蓝有问题吗。
by Neutralized @ 2022-08-22 15:47:56


有问题吗?
by EastPorridge @ 2022-08-22 15:50:45


@[YuRuochen](/user/658786) 看完数据范围在来说难度吧
by NightTide @ 2022-08-22 15:59:54


@[YuRuochen](/user/658786) 看完数据范围在来说难度吧
by LuoTianyi_Official @ 2022-08-22 16:02:13


@[Hoshino_kaede](/user/547908) 虽然但是 $1239$ 数据范围 $10^9$ ![](//啧.tk/jk)
by Dr_Gilbert @ 2022-08-22 16:02:21


@[Hoshino_kaede](/user/547908) 这题1e9和1e12没有区别吧
by Larry0101 @ 2022-08-22 16:02:49


都是数位dp啊,1e9暴力同样过不了
by YuRuochen @ 2022-08-22 16:07:36


@[__Ultimium__](/user/424089) @[Dr_Gilbert](/user/574568)
by YuRuochen @ 2022-08-22 16:11:01


``` #include<bits/stdc++.h> using namespace std; char c[10],q[0]; int dp[10][10][10]; void init(){ for(int i=0;i<10;i++) dp[1][i][i]=1; for(int i=2;i<=9;i++){ for(int j=0;j<10;j++){ for(int k=0;k<10;k++){ if(j==k) dp[i][j][k]=pow(10,i-1); for(int z=0;z<10;z++) dp[i][j][k]+=dp[i-1][z][k]; } } } } long long work(char *c,int u){ if(strlen(c)==0) return 0; int last=0; long long ans=0; int len=strlen(c); for(int i=len-1;i>=0;i--){ int x=c[i]-'0'; for(int j=(i==len-1);j<x;j++) ans+=dp[i+1][j][u]; ans+=x*last*pow(10,i); if(x==u) last++; if(!i) ans+=last; } for(int i=1;i<len;i++){ for(int j=(i!=1);j<10;j++) ans+=dp[i][j][u]; } return ans; } int main(){ scanf("%s",c); int len=strlen(c); for(int i=0;i<len/2;i++) swap(c[i],c[len-i-1]); init(); for(int i=0;i<10;i++){ if(len==1) printf("%lld\n",work(c,i)); else printf("%lld\n",work(c,i)-!i); } return 0; }
by YuRuochen @ 2022-08-23 12:31:16


以上是1239的代码
by YuRuochen @ 2022-08-23 12:42:39


| 下一页