[BZOJ1833] [ZJOI2010]count 数字计数 && 数位DP

来源:互联网 发布:adobe air mac 安装 编辑:程序博客网 时间:2024/04/30 01:29
#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<iostream>#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 12;LL d[MAXN+10][10+10][10+10], pow[MAXN+10];LL A[20], B[20];int bit[MAXN+10];void GetPow() {    pow[0] = 1;    for(int i = 1; i <= MAXN; i++) pow[i] = pow[i-1] * 10;}void dp() {    for(int i = 0; i <= 9; i++) d[1][i][i] = 1;    for(int i = 2; i <= 12; i++)        for(int j = 0; j <= 9; j++) {            for(int k = 0; k <= 9; k++)                for(int cur = 0; cur <= 9; cur++)                    d[i][j][cur] += d[i-1][k][cur];            d[i][j][j] += pow[i-1];        }}void solve(LL x, LL ans[]){    int Len = 0;    LL  X = x;    memset(bit, 0, sizeof(bit));    while(x) {        bit[++Len] = x % 10;        x /= 10;    }    for(int i = 1; i < Len; i++)        for(int j = 1; j <= 9; j++)            for(int k = 0; k <= 9; k++)                ans[k] += d[i][j][k];               for(int i = Len; i >= 1; i--) {        for(int j = 0; j < bit[i]; j++) {            if(!j && i == Len) continue;            for(int k = 0; k <= 9; k++)                ans[k] += d[i][j][k];        }        ans[bit[i]] += X % pow[i-1] + 1;    }}int main(){    LL L, R;    GetPow();    dp();    cin >> L >> R;    solve(L-1, B);    solve(R, A);    PF("%lld", A[0] - B[0]);    for(int i = 1; i <= 9; i++) PF(" %lld", A[i] - B[i]);    puts("");}

0 0
原创粉丝点击