1083: 完美數
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 208 Solved: 57
[Submit][Status][Web Board]
Description
Input
Output
Sample Input
Sample Output
s=0表示既不含3也不含8
s=1表示只含3
s=2表示只含8
s=3表示既含3也含8
f[i][s]表示剩下i位滿足s狀態的總數
#include<cstdio>
#include<cstring>
int a[10],f[10][4];
int new_s(int s,int d){
if(d==3)return s|1;
if(d==8)return s|2;
return s;
}
int dfs(int i,int s,bool e){
if(i==-1)return s==1||s==2;
if(!e&&f[i][s]!=-1)return f[i][s];
int res=0,u=e?a[i]:9,d;
for(d=0;d<=u;d++)res+=dfs(i-1,new_s(s,d),e&&(d==u));
return e?res:f[i][s]=res;
}
int cal(int n){
int i=0;
while(n){a[i++]=n%10,n/=10;}
return dfs(i-1,0,1);
}
int main(){
int T,l,r;
scanf("%d",&T);
memset(f,-1,sizeof(f));
while(T--){
scanf("%d%d",&l,&r);
printf("%d\n",cal(r)-cal(l-1));
}
return 0;
}