题解:UVA12517 Digit Sum
数位 dp 模板题……
题目大意
给你两个数 ,求出 之间所有数的数位和。
什么是数位和?
举个栗子,有一个数 ,那么他的数位和,即各个数位的和为 。
考虑求数位和,采用数位 dp(不会请移步P4999)。
简单分析一下。
- 定义状态:
:以 作为最高位的 位数的数字和。
性质:以 作为最高位的 位数有 个。
- 求状态转移方程:
- 边界条件:
那么接下来就是直接上模板了:
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int mod=1e9+7;
int dp[200][200];
int t;
void init(){
dp[0][0]=0;
for(int i=1;i<=19;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
dp[i][j]+=dp[i-1][k];
}
int sum=1;
for(int k=1;k<=i-1;k++){
sum*=10;
}
dp[i][j]+=j*sum;
}
}
}
int query(int x){
int num[25]={0},ans=0,sum=0,cnt=0;
while(x!=0){
cnt++;
num[cnt]=x%10;
x/=10;
}
for(int i=cnt;i>=1;i--){
for(int j=0;j<=num[i]-1;j++){
ans+=dp[i][j];
int tmp=1;
for(int k=1;k<=i-1;k++){
tmp=tmp*10;
}
ans+=sum*tmp;
}
sum+=num[i];
}
return (ans+sum);
}
signed main(){
init();
while(1){
int l,r;
cin>>l>>r;
if(l==0&&r==0)return 0;
cout<<query(r)-query(l-1)<<endl;
}
return 0;
}
*/
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575282

浙公网安备 33010602011771号