标签:
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 15372 Accepted Submission(s): 5563
#include <stdio.h> #include <string.h> int bit[25]; long long dp[25][2]; long long dfs(int len,bool is4,bool ismax) { if(len==0) return 1; ///搜索成功 if(!ismax&&dp[len][is4]>=0) return dp[len][is4]; long long cnt = 0; int maxnum = ismax? bit[len]:9; for(int i=0; i<=maxnum; i++) { if((is4&&i==9)) continue; cnt +=dfs(len-1,i==4,ismax&&i==maxnum); } return ismax?cnt:dp[len][is4]=cnt; } long long f(long long n) { int len = 0; while(n) { bit[++len] = n%10; n/=10; } return dfs(len,false,true); } int main() { int t; scanf("%d",&t); while(t--) { long long n; scanf("%lld",&n); memset(dp,-1,sizeof(dp)); printf("%lld\n",n-f(n)+1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5796367.html