标签:etc stream 第一个 ... 一个 直接 art using hdu
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; int mi[13],dp[13][4611],oo[13]; inline int read() { register int ans=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} while(isdigit(ch)) {ans=ans*10+ch-‘0‘;ch=getchar();} return ans*f; } inline int reada() { register int ans=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} while(isdigit(ch)) {ans=ans*2+ch-‘0‘;ch=getchar();} return ans*f; } int dfs(int wi,int cha,int lim) { if(wi<1) return 1; if(!lim&&dp[wi][cha]>-1) return dp[wi][cha]; int o=lim? oo[wi]:9; int ans=0; for(int i=0;i<=o;i++) { if(i*mi[wi-1]>cha) break; ans+=dfs(wi-1,cha-i*mi[wi-1],lim&&i==oo[wi]); } if(!lim) dp[wi][cha]=ans; return ans; } int sol(int a,int b) { int w=0; while(b) { oo[++w]=b%10; b/=10; } return dfs(w,a,1); } int main() { int cas,a,b; ///case重名 cas=read(); mi[0]=1; for(int i=1;i<=10;i++) mi[i]=2*mi[i-1]; memset(dp,-1,sizeof(dp)); for(int i=1;i<=cas;i++) { a=reada();b=read(); printf("Case #%d: ",i); printf("%d\n",sol(a,b)); } return 0; }
标签:etc stream 第一个 ... 一个 直接 art using hdu
原文地址:http://www.cnblogs.com/charlotte-o/p/7608270.html