hiho 1033 —— 交错和 【数位DP】

1033 : 交错和

时间限制:10000ms 单点时限:1000ms 内存限制:256MB

描述

给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数:

f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1

例如:

f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4

给定 l, r, k,求在 [lr] 区间中,所有 f(x) = k 的 x 的和,即:

输入

输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100)。

输出

输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7。

提示

对于样例 ,满足条件的数有 110 和 121,所以结果是 231 = 110 + 121。

更多样例:

Input
4344 3214567 3
Output
611668829
Input
404491953 1587197241 1
Output
323937411
Input
60296763086567224 193422344885593844 10
Output
608746132
Input
100 121 -1
Output
120
样例输入
100 121 0
样例输出
231
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

typedef long long LL;

const int MOD = (int) 1e9 + 7;
int a[20];
LL base[20];
int k, len;

struct P{
    LL num, sum;
    P(LL a=-1, LL b=0):num(a),sum(b){
    }
} dp[20][320][3];

P dfs(int cur, int st, int pos, bool limit)
{
    if(cur < 1) return P(st == 160 + k, 0);

    if(!limit && pos!=0 && dp[cur][st][pos].num != -1)    return dp[cur][st][pos];

    int end = limit ? a[cur] : 9;
    P ret(0,0);

    int new_st, new_pos;

    for(int i=0; i<=end; i++) {
        if(pos==0 && i==0) {
            new_pos = pos;
            new_st = st;
        }
        else {
            if(pos<2)    new_pos = pos + 1;
            else    new_pos = pos - 1;

            if(new_pos & 1)    new_st = st + i;
            else    new_st = st - i;
        }

        P p = dfs(cur-1, new_st, new_pos, limit&&i==end);
        ret.num = (ret.num + p.num) % MOD;
        ret.sum = (ret.sum + (p.num * i) % MOD * base[cur] % MOD + p.sum) % MOD;
    }
    if(!limit && pos!=0)    dp[cur][st][pos] = ret;
    return ret;
}

int f(LL x)
{
    len = 0;
    while(x) {
        a[++len] = x%10;
        x/=10;
    }
    return dfs(len, 160, 0, 1).sum;
}

void Init()
{
    base[1] = 1;
    for(int i=2; i<=19; i++) {
        base[i] = base[i-1] * 10 % MOD;
    }
}

int main ()
{
    Init();

    LL l, r;
    scanf("%lld%lld%d", &l, &r, &k);
    printf("%lld\n", (f(r) - f(l-1) + MOD) % MOD);

    return 0;
} 
时间: 2024-10-14 15:31:29

hiho 1033 —— 交错和 【数位DP】的相关文章

[hihocoder 1033]交错和 数位dp/记忆化搜索

#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0,?a1,?...,?an?-?1,定义交错和函数: f(x)?=?a0?-?a1?+?a2?-?...?+?(?-?1)n?-?1an?-?1 例如: f(3214567)?=?3?-?2?+?1?-?4?+?5?-?6?+?7?=?4 给定 输入 输入数据仅一行包含三个整数,l,?r,?k(0?≤?l?≤?r?≤?1018,?|k|

hihoCoder #1033 : 交错和 [ 数位dp ]

传送门 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,即

hihoCoder1033 交错和 数位DP

题目:交错和 链接:http://hihocoder.com/problemset/problem/1033# 题意:对于一个十进制整数x,令a0.a1.a2.....an是x从高位到低位的数位,定义f(x)=a0-a1+a2-a3+...an,给出L.R.K,x在L到R之间,求所有满足:f(x)=k的x的和.(0 ≤ l ≤ r ≤ 10^18, |k| ≤ 100) 思路: L与R太大,连预处理的可能性都没有,很明显的数位DP. 令dp[i][j]为精确的(有前导0)i 位,f(x)值为j

hiho#1033 : 交错和

描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 输入 输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100). 输出 输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7

[数位dp] hihoCoder 1033 交错和

题意: 问你[l,r]区间内的所有满足各个位一加一减最后和是k的全有数的和. 思路: 数位dp dp[site][sum][p][k] 代表site位,和是sum,当前是加还是减,最后和是k的数的和以及个数 也就是存成结构体. 然后求的时候 ans.cnt=(ans.cnt+cur.cnt)%mod; ans.sum=(ans.sum+cur.sum+cur.cnt*tep)%mod; tep为i*当前位的位权. 代码: #include"cstdlib" #include"

【hihoCoder】1033: 交错和

初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[0, l)满足条件的个数 2. 求解 区间[0, n]满足条件的个数 性质:一个小于n的数m,一定是从高位到低位在某一位小于n的对应位的一个数   数值 百位 十位 个位   n 358 3 5 8   m 350 3 5 0 0<8 m 349 3 4 9 4<5 遍历所有小于n的数:从高位到低

数位dp/记忆化搜索

一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,

[hdu 4933]Miaomiao&#39;s Function 数位DP+大数

Miaomiao's Function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 79    Accepted Submission(s): 18 Problem Description Firstly , Miaomiao define two functions f(x) , g(x): (K is the smallest

hihocoder1033(数位dp)

题目: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0,?a1,?...,?an?-?1,定义交错和函数: f(x)?=?a0?-?a1?+?a2?-?...?+?(?-?1)n?-?1an?-?1 例如: f(3214567)?=?3?-?2?+?1?-?4?+?5?-?6?+?7?=?4 给定 输入 输入数据仅一行包含三个整数,l,?r,?k(0?≤?l?≤?r?≤?1018,?|k|?≤?100). 输出 输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109?+?