hdu 6156

来源:互联网 发布:windows 2012 mse 编辑:程序博客网 时间:2024/06/10 00:38

数位dp

#include<iostream>#include<stdio.h>using namespace std;typedef long long ll;int t,d[40],cur[40];ll L,R,l,r,dp[40][40][40][2];ll dfs(int k,int l,int r,bool flag,bool limit){    if(l==-1) return flag?k:1;    if(!limit&&dp[k][l][r][flag]) return  dp[k][l][r][flag];    int mx=limit?d[l]:k-1;    ll ret=0;    for(int i=0;i<=mx;i++){        cur[l]=i;        if(i==0&&l==r)            ret+=dfs(k,l-1,r-1,flag,limit&&(i==mx));        else if(flag&&l*2<=r)            ret+=dfs(k,l-1,r,flag&&cur[l]==cur[r-l],limit&&(i==mx));        else            ret+=dfs(k,l-1,r,flag,limit&&(i==mx));    }    if(!limit) dp[k][l][r][flag]=ret;    return ret;}ll solve(ll n,ll k){    int pos=0;    while(n){        d[pos++]=n%k;        n/=k;    }    return dfs(k,pos-1,pos-1,1,1);}int main(){    scanf("%d",&t);    int cas=0;    while(t--){        scanf("%lld%lld%lld%lld",&L,&R,&l,&r);        ll ans=0;        for(int i=l;i<=r;i++)            ans+=solve(R,i)-solve(L-1,i);        printf("Case #%d: %lld\n",++cas,ans);    }}


原创粉丝点击