题目非常明白,一个数如果连续的奇数的个数都为偶数,而连续的偶数的个数都为奇数,那么则符合条件,要求计算出给定的区间里面所有的符合条件的数的数量
题解:
dp【i】【j】【k】分别代表当前位置,值的奇偶,长度奇偶,套一边模板就ok。不过要注意前导0的问题,还有就是下面记忆化搜索记录值时也要加上前导0的判断。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <list>
#include <queue>
#include <map>
#include <bitset>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-3
#define maxn 1000100
#define MOD 1000000007
long long dp[35][2][2];
int bit[35];
long long L,R;
long long dfs(int pos,int st,int len,int zero,int flag)
{
if(!pos)
return zero && ((st&1)&&!len || (!st&&(len&1)));
if(flag && zero && dp[pos][st][len] != -1)
return dp[pos][st][len];
int u = flag?9:bit[pos];
long long ans = 0;
for(int i = u; i >= 0; i--)
{
if(!zero)
{
if(i == 0)
ans += dfs(pos-1,0,0,0,flag||i<u);
else
ans += dfs(pos-1,i&1,1,1,flag||i<u);
}
else if(!st)
{
if(i%2 == 0)
ans += dfs(pos-1,0,len^1,1,flag||i<u);
else if(len & 1)
ans += dfs(pos-1,1,1,1,flag||i<u);
}
else
{
if(i & 1)
ans += dfs(pos-1,1,len^1,1,flag||i<u);
else if(!len)
ans += dfs(pos-1,0,1,1,flag||i<u);
}
//if(pos == 1)
// printf("%d %lld\n",i,ans);
}
if(flag && zero)
dp[pos][st][len] = ans;
return ans;
}
long long solve(long long x)
{
int len = 0;
while(x)
{
bit[++len] = x % 10;
x /= 10;
}
return dfs(len,0,0,0,0);
}
int main()
{
int t,C = 1;
memset(dp,-1,sizeof(dp));
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&L,&R);
printf("Case #%d: %lld\n",C++,solve(R)-solve(L-1));
}
return 0;
}