Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 11804 Accepted Submission(s): 4212
【思路】
数位DP。
预处理:
f[i][0] 表示i位数中不含49的数的数目
f[i][1] 表示i位数中不含49且末尾为9的数的数目
f[i][1] 表示i位数中含49的数的数目
根据n的每一位统计ans,具体见代码。
【代码】
1 #include<cstdio> 2 using namespace std; 3 4 typedef long long LL; 5 LL f[25][3]; 6 /* 7 f[i][0] i位数 无49存在 8 f[i][1] i位数 无49存在且末尾为9 9 f[i][2] i位数 有49 10 */ 11 int b[25]; 12 13 void init() { 14 f[0][0]=1; f[0][1]=f[0][2]=0; 15 for(int i=1;i<25;i++) { 16 f[i][0]=10*f[i-1][0]-f[i-1][1]; 17 f[i][1]=f[i-1][0]; 18 f[i][2]=10*f[i-1][2]+f[i-1][1]; 19 } 20 } 21 22 int main() { 23 int T; LL n; 24 scanf("%d",&T); 25 init(); 26 while(T--) { 27 scanf("%I64d",&n); 28 int len=0; 29 while(n) 30 b[++len]=n%10 , n/=10; 31 b[len+1]=0; 32 LL ans=0; bool flag=0; 33 for(int i=len;i;i--) { 34 ans += b[i]*f[i-1][2]; // + ...49... 35 if(flag) ans += f[i-1][0]*b[i]; // + 49...(无49...) 36 else if(b[i]>4) ans += f[i-1][1]; // + 4(9 无49) 37 if(b[i+1]==4 && b[i]==9) flag=1; 38 } 39 if(flag) ans++; //算上自身 40 printf("%I64d\n",ans); 41 } 42 return 0; 43 }
原文:http://www.cnblogs.com/lidaxin/p/5122181.html