hdu5898 odd-even number(数位dp)

题意:

求L到R区间内,连续奇数个数是偶数,连续偶数个数是奇数的数的个数

思路:

裸数位dp,赛场上忘了不合法的break,妈的调了一个多小时简直是日了狗了!

本来就是蒟蒻还感冒了什么题都写不出来

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
#define inf 0x3f3f3f3f
#define LL long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ou(a) printf("%d\n",a)
#define pb push_back
#define mkp make_pair
template<class T>inline void rd(T &x){char c=getchar();x=0;while(!isdigit(c))c=getchar();while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}}
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
using namespace std;
const int mod=1e9+7;
const int N=310;
LL dp[22][4];
void init()
{
    dp[1][0]=1;
    dp[1][2]=1;
    for(int i=2;i<20;i++)
    {
        dp[i][0]=(dp[i-1][2]+dp[i-1][1])*5;
        dp[i][1]=dp[i-1][0]*5;
        dp[i][2]=(dp[i-1][1]+dp[i-1][3])*5;
        dp[i][3]=dp[i-1][2]*5;
    }
}
int bit[21];
LL solve(LL n)
{
    int len=0;
    while(n)
    {
        bit[++len]=n%10;
        n/=10;
    }
    bit[len+1]=0;
    LL ans=0;
    int tp=bit[len]/2;
    ans=ans+dp[len][1]*tp;
    if(bit[len]%2==0) tp--;
    ans=ans+dp[len][2]*tp;
    for(int i=len-1;i>=1;i--)
    {
        ans=ans+dp[i][1]*5;
        ans=ans+dp[i][2]*4;
    }
    int now=bit[len]%2,ln=1;
    for(int i=len-1;i>=1;i--)
    {
        if(now%2==1)
        {
            if(ln%2==1)
            {
                ans=ans+dp[i][0]*(bit[i]/2);
                if(bit[i]%2) ln++;
                else break;
            }
            else
            {
                int tp=bit[i]/2;
                ans=ans+dp[i][1]*tp;
                if(bit[i]%2!=0) tp++;
                ans=ans+dp[i][2]*tp;
                if(bit[i]%2) ln++;
                else
                {
                    now=0;
                    ln=1;
                }
            }
        }
        else
        {
            if(ln%2==1)
            {
                int tp=bit[i]/2;
                ans=ans+dp[i][1]*tp;
                if(bit[i]%2) tp++;
                ans=ans+dp[i][3]*tp;
                if(bit[i]%2)
                {
                    now=1;
                    ln=1;
                }
                else ln++;
            }
            else
            {
                int tp=bit[i]/2;
                if(bit[i]%2!=0) tp++;
                ans=ans+dp[i][2]*tp;
                if(bit[i]%2) break;
                else ln++;
            }
        }
    }
    return ans;
}
int main()
{
    init();
    int t,cas=0;
    LL n,m;
    rd(t);
    while(t--)
    {
        scanf("%lld%lld",&n,&m);
        printf("Case #%d: %lld\n",++cas,solve(m+1)-solve(n));
    }
    return 0;
}
时间: 2024-11-10 00:52:51

hdu5898 odd-even number(数位dp)的相关文章

Hdu3079Balanced Number数位dp

枚举支点,然后就搞,记录之前的点的力矩和. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <s

SPOJ MYQ10 Mirror Number 数位dp&#39;

题目链接:点击打开链接 MYQ10 - Mirror Number A number is called a Mirror number if on lateral inversion, it gives the same number i.e it looks the same in a mirror. For example 101 is a mirror number while 100 is not. Given two numbers a and b, find the number

多校5 HDU5787 K-wolf Number 数位DP

1 // 多校5 HDU5787 K-wolf Number 数位DP 2 // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d 3 // f 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小 4 // 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位 5 // http://blog.csdn.net/weizhuwyzc000/article/details/5209769

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

hdu 5898 odd-even number(数位dp)

Problem Description For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18). Input Fir

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

fzu 2109 Mountain Number 数位DP

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则这个数为Mountain Number. 给出L, R,求区间[L, R]有多少个Mountain Number. 思路: 数位DP,判断当前是偶数位还是奇数位(从0开始),如果是偶数位,那么它要比前一个数的值小, 如果是奇数位,那么它要比前一个数的值大. 1 #include <iostream>

hdu3709---Balanced Number(数位dp)

Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the nu

HDU 3709 Balanced Number (数位DP)

Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3798    Accepted Submission(s): 1772 Problem Description A balanced number is a non-negative integer that can be balanced if a pi