hdu 2089 不要62

来源:互联网 发布:mac jdk1.7 dmg 编辑:程序博客网 时间:2024/04/30 02:53
#include <iostream>#include <cstring>#include <cstdio>using namespace std;int dp[10][3];int DP(int x){bool flag = false;int s[15];int idx = 0, sum = x, ans = 0;for(; x; x /= 10)s[++idx] = x % 10;s[idx+1] = 0;for(int i = idx; i > 0; --i){ans += dp[i-1][2] * s[i];//表示i位以后出现了不吉利数字,那么以s[i]为首位的不吉利数就为ans += dp[i-1][2]*s[i]if(flag)ans += dp[i-1][0]*s[i];//之前出现不吉利的数字else{if(s[i] > 4)ans += dp[i-1][0];if(s[i] > 6)ans += dp[i-1][1];if(s[i+1] == 6 && s[i] > 2)ans += dp[i][1];}if(s[i] == 4 || (s[i+1] == 6 && s[i] == 2))flag = true;}return sum - ans;//所有的数减去不吉利的数}int main(){int a, b;memset(dp, 0, sizeof(dp));dp[0][0] = 1;//预处理,算出所有可能for(int i = 1; i <= 8; ++i){dp[i][0] = dp[i-1][0]*9 - dp[i-1][1];//在不含不吉利数的末位分别补除了4的9个数字,减去在6后面补2的个数dp[i][1] = dp[i-1][0];//在不含不吉利数在末位补6dp[i][2] = dp[i-1][2]*10 + dp[i-1][1] + dp[i-1][0];//各种出现不吉利数的情况}while(cin>>a>>b){if(a+b == 0)break;cout<<DP(b+1) - DP(a)<<endl;}return 0;}

原创粉丝点击