数位DP裸题。
写代码5min,交上去,WA。。。。。。。。
对拍半小时,错误不断,终于过了。
果然对拍还是不能少,AC率又掉了55555555
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll f[20][20][20],ex[20]; void dp(){ ex[0]=1; for(int i=1;i<=12;i++)ex[i]=ex[i-1]*10; for(int i=1;i<=12;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++){ if(j==k)f[i][j][k]=ex[i-1]; for(int h=0;h<=9;h++) f[i][j][k]+=f[i-1][h][k]; } } ll calc(ll a,int k){ if(!a)return 0; ll ans=0; int num[20],len=1;num[len]=a%10;a/=10; while(a){ num[++len]=a%10; a/=10; } for(int i=1;i<num[len];i++)ans+=f[len][i][k]; for(int i=len-1;i>=1;i--){ for(int j=0;j<num[i];j++) ans+=f[i][j][k]; } for(int i=len;i>1;i--) if(num[i]==k){ ll x=0; for(int j=i-1;j>=1;j--) x=x*10+num[j]; ans+=x+1; } if(num[1]==k)ans++; for(int i=1;i<len;i++){ for(int j=1;j<=9;j++) ans+=f[i][j][k]; } return ans; } int main(){ ll a,b;scanf("%lld%lld",&a,&b); dp(); for(int i=0;i<=9;i++) if(!i)printf("%lld",calc(b,i)-calc(a-1,i)); else printf(" %lld",calc(b,i)-calc(a-1,i)); return 0; }