2016 ACM/ICPC Reginal Shengyang hdu5898 odd-even number(上下要统一,前导0)★

来源:互联网 发布:php curl 超时设置 编辑:程序博客网 时间:2024/05/29 02:23
题目非常明白,一个数如果连续的奇数的个数都为偶数,而连续的偶数的个数都为奇数,那么则符合条件,要求计算出给定的区间里面所有的符合条件的数的数量

题解:
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 1000000007long 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;}


0 0
原创粉丝点击