找个机会复习一下。。重新写一边题解。。
HDU 2089
#include <cstdio>
#define FOR(i,j,k) for(i=j;i<=k;i++)
int dp[16][10];
void init() {
int i, j, k;
dp[0][0] = 1;
FOR(i,1,14) FOR(j,0,9) {
dp[i][j]=0;
if (j != 4) FOR(k,0,9) if (j != 6 && k != 2)
dp[i][j] += dp[i - 1][k];
}
}
int calc(int n) {
static int digit[16];
int l = 0, ans = 0, i, j;
while (n) {
digit[++l] = n % 10;
n /= 10;
}
digit[l + 1] = 0;
for (i = l; i; --i) {
for (j = 0; j < digit[i]; ++j)
if (j != 4 && !(digit[i+1]==6 && j == 2))
ans += dp[i][j];
if (digit[i] == 4 || (digit[i] == 2 && digit[i + 1] == 6))
break;
}
return ans;
}
int main() {
int i, j;
init();
while(~scanf("%d%d", &i, &j)) {
if(i+j==0)break;
printf("%d\n", calc(j+1)-calc(i));
}
return 0;
}
HDU 3555
#include <cstdio>
#define FOR(i,j,k) for(i=j;i<=k;i++)
typedef unsigned long long ull;
ull dp[32][10];
void init() {
int i, j, k;
dp[0][0] = 1;
FOR(i,1,25) FOR(j,0,9) {
dp[i][j] = 0;
FOR(k,0,9) if(j != 4 || k != 9)
dp[i][j] += dp[i - 1][k];
}
}
ull calc(ull n) {
static ull digit[32];
ull l = 0, ans = 0, i, j;
while (n) {
digit[++l] = n % 10;
n /= 10;
}
digit[l+1]=0;
for (i = l; i; --i) {
for (j=0;j<digit[i];j++)
if (!(digit[i + 1] == 4 && j == 9))
ans += dp[i][j];
if (digit[i] == 9 && digit[i + 1] == 4)
break;
}
return ans;
}
int main() {
ull i; int t;
init();
scanf("%d", &t);
while (t--) {
scanf("%I64u", &i);
printf("%I64u\n", i+1-calc(i+1));
}
return 0;
}