和某道题出奇的相似
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define int long long
using namespace std ;
int read() {
int x = 0 , f = 1 ; char s = getchar() ;
while(s > '9' || s < '0') {if(s == '-') f = -1 ; s = getchar() ;}
while(s <='9' && s >='0') {x = x * 10 + (s-'0'); s = getchar() ;}
return x*f ;
}
int f[20][20][2][2][11] , num[20] ;
int dfs(int pos ,int sum ,bool lead,bool limit ,int d) {
if(!pos) return sum ;
if(!limit&&!lead&&f[pos][sum][lead][limit][d] != -1) return f[pos][sum][lead][limit][d] ;
int up = limit ? num[pos] : 9 ;
int res = 0 ;
for(int i = 0 ; i <= up ; i ++) {
res += dfs(pos-1,sum+(i==d&&(i||!lead)),lead&&(i==0),limit&&(i==up),d) ;
}
if(!limit&&!lead) f[pos][sum][lead][limit][d] = res ;
return res ;
}
int calc(int x,int d) {
int len = 0 ;
while(x) {
num[++len] = x % 10 ;
x /= 10 ;
}
memset(f,-1,sizeof f) ;
return dfs(len,0,1,1,d) ;
}
int r , ans ;
signed main () {
r = read() ;
for(int i = 0 ; i < 10 ; i ++) {
ans += calc(r,i)*i ;
}
printf("%lld
",ans) ;
return 0 ;
}