标签:个数 limit 大众 ota 杭州 注意 scan set 数字
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 43588 Accepted Submission(s):
16034
/* 数位dp入门 f[i][j]表示一共有i位且最高位为j的符合条件个数 digit[i]表示从右往左数i个是什么数 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int f[10][10],digit[10],len,ans; void init() { memset(f,0,sizeof f); f[0][0]=1; for(int i=1;i<=7;i++)//位数 for(int j=0;j<10;j++)//当前位 for(int k=0;k<10;k++)//后一位 if(j!=4 && !(j==6&&k==2)) f[i][j]+=f[i-1][k]; } int solve(int n)//统计1~n中符合条件 { init();len=0;ans=0; while(n>0) { digit[++len]=n%10; n/=10; }digit[len+1]=0; for(int i=len;i;i--) { for(int j=0;j<digit[i];j++)//important { if(j!=4 && !(digit[i+1]==6&&j==2)) ans+=f[i][j]; } if(digit[i]==4 || (digit[i]==2&&digit[i+1]==6)) break;//低位出现4 62高位不再考虑 } return ans; } int main() { int l,r; while(scanf("%d%d",&l,&r)) { if(l+r==0) break; printf("%d\n",solve(r+1)-solve(l)); } return 0; }
标签:个数 limit 大众 ota 杭州 注意 scan set 数字
原文地址:http://www.cnblogs.com/L-Memory/p/7189656.html