hdu 2089
#include <cstdio>
#include <cstring>
int dp[10][3], bit[10];
int work(int x)
{
int i, j, len, k, ans, flag, last;
memset(bit, 0, sizeof(bit));
flag = last = ans = len = 0;
k = x;
while (x)
{
bit[++len] = x%10;
x /= 10;
}
for (i = len; i >= 1; i--)
{
ans += dp[i-1][2]*bit[i];
if (flag) ans += dp[i-1][0]*bit[i];
else
{
if (bit[i] > 4) ans += dp[i-1][0];
if (bit[i] > 6) ans += dp[i-1][1];
if (last == 6 && bit[i] > 2) ans += dp[i][1];
}
if (last == 6 && bit[i] == 2 || bit[i] == 4) flag = 1;
last = bit[i];
}
return k-ans;
}
int main()
{
int i, a, b;
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (i = 1; i <= 8; i++)
{
dp[i][0] = dp[i-1][0]*9 - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2]*10 + dp[i-1][1] + dp[i-1][0];
}
while (scanf("%d%d", &a, &b) && a && b)
{
printf("%d\n", work(b+1)-work(a));
}
return 0;
}
hdu 3555
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
long long int dp[21][3];
int bit[21];
void Init()
{
int i, j;
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (i = 1; i < 20; i++)
{
dp[i][0] = dp[i-1][0]*10 - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2]*10 + dp[i-1][1];
}
}
int main()
{
int T, i, len, flag;
long long int n, ans;
Init();
scanf("%d", &T);
while (T--)
{
scanf("%I64d", &n);
len = 0;
n++;
while (n)
{
bit[++len] = n%10;
n /= 10;
}
ans = 0;
bit[len+1] = 0;
flag = 0;
for (i = len; i ; i--)
{
ans += dp[i-1][2]*bit[i];
if (flag)
ans += dp[i-1][0]*bit[i];
if (flag == 0 && bit[i] > 4)
ans += dp[i-1][1];
if (bit[i] == 9 && bit[i+1] == 4)
flag = 1;
}
printf("%I64d\n", ans);
}
return 0;
}