HDU 3709 Balanced Number(数位dp)

来源:互联网 发布:死神vs火影月改优化版 编辑:程序博客网 时间:2024/05/19 17:10

枚举平衡点的位置

#include<cstdio>#include<cstring>typedef long long ll;int dig[20];ll d[20][20][2000];ll dp(int po,int bal,int sum,bool zero,bool limit) {if(po<0) return sum==0;if(!limit&&!zero&&d[po][bal][sum]!=-1) return d[po][bal][sum];int to=limit?dig[po]:9;ll ans=0;for(int i=0;i<=to;++i) {if(zero&&i==0&&bal>=po) continue; int nxtsum=sum+i*(po-bal);if(nxtsum>=0) ans=ans+dp(po-1,bal,nxtsum,zero&&i==0,limit&&i==to);}if(!limit&&!zero) d[po][bal][sum]=ans;return ans;}ll solve(ll x) {if(x==-1) return 0;int po=0;while(x) {dig[po++]=x%10;x/=10;}ll ans=0;for(int bal=0;bal<po;++bal) ans=ans+dp(po-1,bal,0,1,1);return ans+1;}int main() {memset(d,-1,sizeof(d));int T;scanf("%d",&T);while(T--) {ll l,r;scanf("%lld%lld",&l,&r);printf("%lld\n",solve(r)-solve(l-1));}return 0;}


0 0