做完发现好像做麻烦了,,直接组合一位一位求。。。
我用数位dp弄的。。。。。。。
/*************
*Author:chanjun
*email:15755396353@163.com
*************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <list>
#include <deque>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define LL long long
const int a[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
void devide(int n, int &l,int *p){
while (n){
p[l++] = n % 10;
n /= 10;
}
}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int n;
scanf("%d",&n);
int f[11][10] = {0};
f[1][1] = 1;
for (int i = 1; i <= 10; ++i){
for (int j = 0; j < 10; ++j){
for (int k = 0; k < 10; ++k){
f[i][j] += f[i-1][k];
}
if (j ==1){
f[i][j] = f[i][j] * j + a[i-1];
}
}
}
int l = 0;
int b[12];
devide(n,l,b);
int ans = 0;
for (int i = l-1; i >= 0; --i){
for (int j = 0; j < b[i]; ++j){
ans += f[i+1][j];
}
if (b[i] == 1){
ans = ans + n-a[i];
if (n!=1) ++ ans;
}
n -= a[i]*b[i];
}
cout << ans << endl;
system("pause");
return 0;
}