bzoj1833数位dp(据说是模板)

    xiaoxiao2021-03-26  32

    woc,恶心了我半天,对于1--9还好处理,但是0这个东西总是要特殊处理,很烦人。

    最后想到0也一样处理,然后减去不合法的就是前导0的数量就好

     

    据说是模板,我都费这么大劲,好弱啊

    #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; ll f[15],A,B,g[15],f0[15]; int a[15],b[15]; ll work(int a[],int t) { int m=a[0];ll ans=0,tmp=0; for (int i=1;i<=m;i++) { for (int j=0;j<a[i];j++) { ans+=f[i-1]; if (j==t) ans+=g[i-1]; } if (a[i]==t) ans+=tmp+1; tmp=tmp+g[i-1]*a[i]; } if (t==0) { for (int i=m-1;i>=1;i--) ans-=g[i]; } return ans; } int main() { scanf("%lld%lld",&B,&A);B--; while (A) a[++a[0]]=A,A=A/10;if (a[0]==0) a[0]=1; while (B) b[++b[0]]=B,B=B/10;if (b[0]==0) b[0]=1; g[0]=1;for (int i=1;i<=13;i++) g[i]=g[i-1]*10; f[1]=1;for (int i=2;i<=13;i++) f[i]=f[i-1]*10+g[i-1]; for (int i=0;i<=9;i++) { printf("%lld",work(a,i)-work(b,i)); if (i!=9) printf(" "); } return 0; }

     

    转载请注明原文地址: https://ju.6miu.com/read-662897.html

    最新回复(0)