BZOJ1833: [ZJOI2010]count 数字计数
30%的数据中,a<=b<=10^6;
100%的数据中,a<=b<=10^12。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define MAXN 15 using namespace std; int bit[MAXN]; long long A,B; long long ans[MAXN][2],dp[MAXN][MAXN][MAXN]; inline long long read(){ long long date=0,w=1;char c=0; while(c<‘0‘||c>‘9‘){if(c==‘-‘)w=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){date=date*10+c-‘0‘;c=getchar();} return date*w; } long long mexp(long long a,long long b){ long long s=1; while(b){ if(b&1)s*=a; a*=a; b>>=1; } return s; } void solve(long long n,int d){ int len=0; memset(dp,0,sizeof(dp)); memset(bit,0,sizeof(bit)); while(n){ bit[++len]=n%10; n/=10; } for(int i=0;i<=9;i++)dp[1][i][i]=1; for(int i=2;i<=len;i++) for(int j=0;j<=9;j++){ for(int k=0;k<=9;k++) for(int now=0;now<=9;now++) dp[i][j][now]+=dp[i-1][k][now]; dp[i][j][j]+=mexp(10,i-1); } for(int i=1;i<len;i++) for(int j=1;j<=9;j++) for(int k=0;k<=9;k++) ans[k][d]+=dp[i][j][k]; for(int i=1;i<bit[len];i++) for(int j=0;j<=9;j++) ans[j][d]+=dp[len][i][j]; for(int i=len-1;i>=1;i--){ for(int j=0;j<bit[i];j++) for(int k=0;k<=9;k++) ans[k][d]+=dp[i][j][k]; for(int j=len;j>i;j--)ans[bit[j]][d]+=1LL*bit[i]*mexp(10,i-1); } } void work(){ A=read();B=read(); solve(B+1,0);solve(A,1); for(int i=0;i<=9;i++)printf("%lld ",ans[i][0]-ans[i][1]); printf("\n"); } int main(){ work(); return 0; }
BZOJ1833: [ZJOI2010]count 数字计数
原文:https://www.cnblogs.com/Yangrui-Blog/p/9763787.html