标签: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