51nod 1042 数字0-9的数量 数位DP

51nod 1042 数字0-9的数量 传送门

偷来的代码。。记板子记板子……感觉大佬的代码一直都好清晰简洁,学习学习 http://blog.csdn.net/f_zyj/article/details/52082449

#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
ll l,r,dp[20];
ll qpow(ll x,ll n)  //emmmm快速幂
{
    ll res=1;
    while(n)
    {
        if(n&1) res*=x;
        x*=x;
        n>>=1;
    }
    return res;
}
void init() //初始化
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<20;i++)
     dp[i]=dp[i-1]*10+qpow(10,i-1);
}
ll DP(ll x,ll i)
{
    ll res=0,len=0,digit=0,radix=1,tail=0,nx=x;
    while(x)
    {
        digit=x%10;
        x/=10;
        ++len;
        if(digit>i)
         res+=radix+digit*dp[len-1];
        else if(digit==i)
         res+=tail+1+digit*dp[len-1];
        else if(digit<i)
         res+=digit*dp[len-1];
        tail+=digit*radix;
        radix*=10;
    }
    if(i==0)  //处理前缀为0的情况
    {
        ll m=1;
        while(nx)
        {
            nx/=10;
            res-=m;
            m*=10;
        }
    }
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    init();
    cin>>l>>r;
    for(int i=0;i<10;i++)
     cout<<DP(r,i)-DP(l-1,i)<<endl;
     return 0;
 } 
原文地址:https://www.cnblogs.com/Egoist-/p/7652674.html