HDU 4507 —— 吉哥系列故事――恨7不成妻

吉哥系列故事――恨7不成妻

Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

  单身! 
  依然单身! 
  吉哥依然单身! 
  DS级码农吉哥依然单身! 
  所以,他生平最恨情人节,不管是214还是77,他都讨厌! 
   
  吉哥观察了214和77这两个数,发现: 
  2+1+4=7 
  7+7=7*2 
  77=7*11 
  最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数!

  什么样的数和7有关呢?

  如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关―― 
  1、整数中某一位是7; 
  2、整数的每一位加起来的和是7的整数倍; 
  3、这个整数是7的整数倍;

  现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和。

Input

输入数据的第一行是case数T(1 <= T <= 50),然后接下来的T行表示T个case;每个case在一行内包含两个正整数L, R(1 <= L <= R <= 10^18)。

Output

请计算[L,R]中和7无关的数字的平方和,并将结果对10^9 + 7 求模后输出。

Sample Input

3

1 9

10 11

17 17

Sample Output

236

221

0

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

typedef long long LL;

struct P{
    LL num, sum, sqrt;
    P(LL a=-1, LL b=0, LL c=0):num(a),sum(b),sqrt(c){}
};

const int MOD = (int)1e9+7;
int a[20];
LL base[20];
P dp[20][7][7];

P dfs(int len, int mod1, int mod2, bool limit)
{
    if(len < 1)
        return P(mod1 != 0 && mod2 != 0, 0, 0);

    if(!limit && dp[len][mod1][mod2].num!=-1)    return dp[len][mod1][mod2];
    int maxn = limit ? a[len] : 9;
    P ret(0,0,0);
    for(int i=0; i<=maxn; i++) {
        if(i==7)    continue;
        P cur = dfs(len-1, (mod1+i%7)%7, (mod2*(10%7)+i)%7, limit&&i==maxn);
        ret.num = (ret.num + cur.num) % MOD;
        ret.sum = (ret.sum + cur.sum + i * base[len] % MOD * cur.num % MOD) % MOD;
        LL temp = i*base[len]%MOD;
        ret.sqrt = (ret.sqrt + cur.sqrt + cur.num*temp%MOD*temp%MOD + 2*temp%MOD*cur.sum%MOD)%MOD;
    }
    if(!limit)    dp[len][mod1][mod2] = ret;
    return ret;
}

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

void Init()
{
    base[1]=1;
    for(int i=2; i<20; i++) {
        base[i] = base[i-1]*10;
//        printf("%lld\n", base[i]); //
    }
}

int main ()
{
    Init();

    int T;
    LL l, r;
    scanf("%d", &T);
    while(T--) {
        scanf("%I64d%I64d", &l, &r);
        printf("%I64d\n", (f(r) - f(l-1) + MOD) % MOD);
    }

    return 0;
}
时间: 2024-08-03 07:12:10

HDU 4507 —— 吉哥系列故事――恨7不成妻的相关文章

Hdu 4507 吉哥系列故事——恨7不成妻 (数位DP)

题目链接: Hdu 4507 吉哥系列故事——恨7不成妻 题目描述: 中文题面不描述. 解题思路: 从数据范围可看出是数位DP.根据题目给的限制,如果是求满足限制的数的数目的话,就很简单了.但是这个题目是让求满足题目中限制的数的平方和.我们可以求出区间中满足题目中限制的数的数目,和这些数的和,然后从这两个东西推出这些数的平方和. 假设现在我们已经递归出后面的x-1位满足题目限制的数的数目(num),和(sum),平方和(ssum),当前x位枚举为i,就可以推出当前节点改变为Num += num,

HDU - 4507 吉哥系列故事――恨7不成妻 (数位DP)

Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7*11 最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数! 什么样的数和7有关呢? 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关―― 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数

HDU 4507 吉哥系列故事――恨7不成妻(数位dp&amp;好魔性的一道好题)

题目链接:[kuangbin带你飞]专题十五 数位DP J - 吉哥系列故事――恨7不成妻 题意 Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7*11 最终,他发现原来这一切归根到底都是

HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)

链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=72 77=711 最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数! 什么样的数和7有关呢? 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关-- 1.整数中某一位是7: 2.

HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 求一定区间内和7无关的数字的平方和. 解题思路:这里我们用一个结构体分别存储符合条件的数的个数n,从当前位开始至末尾的数值s(比如一个数当前为1234***,*表示还不知道的位值,代表的就是***),从当前位开始至末尾的数的平方

HDU 4507 吉哥系列故事——恨7不成妻

需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mod 1000000007LL using namespace std; long long bit[30],tab[50],ret=0,t,l,r; struct pnt { long long val1,val2,val3; pnt (long

HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)

题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区间内和7无关的所有数字的平方和. 思路: 第一步好解决,只是数位DP的基础.第二步是十进制的所有位加起来是7的整数倍,这个只是需要用多一维来记录%7的结果就行了.第三步是7的整数倍问题,假设c=a+b,那么c%7=(a%7+b)%7,就假设这个数是10086,那么(10000%7+86)%7就行了,

[数位dp] hdu 4507 吉哥系列故事——恨7不成妻

题意:在一定区间内和7无关的数字的平方和. 思路:这种醉醉的题目,也是醉醉的. 其实理解了,就醒了~ 首先只求有多少个数,那么大家肯定都会了. 但是这里我们对于dp[site][mod][sum] 要维护3个东西,n:有多少个数.sum:这些数的和.sumqrt这些数的平方和. 我们通过递归,n就是我们大家都会的那个东西,那么对于这些数的和. 举个例子,比如求12 那就是0~12的和. 0:0~9 1:0~2 这两段. 那么我们如果知道0~9的和又知道有10个数 那么他们的和便是 0*10*10

[HDU 4507] 吉哥系列故事――恨7不成妻

求所有满足要求的数的平方和 不只是统计个数,而是与每个数得具体取值有关 维护三个值 dp[dep][sum][num].num表示长度为dep的前面的数模7的余数为sum,前面几位数字之和模7为num的满足要求的数的个数 dp[dep][sum][num].sum表示长度为dep的前面的数模7的余数为sum,前面几位数字之和模7为num的满足要求的数的和 dp[dep][sum][num].sq表示长度为dep的前面的数模7的余数为sum,前面几位数字之和模7为num的满足要求的数的平方和 设当