【题解】吉哥系列故事——恨7不成妻

\(Description:\)

给出区间 \([L,R]\) 求出区间中所有满足没有 \(7\) 这个数并且这个数不会被 \(7\) 整除,同时这个数各位上的和不能被 \(7\) 整除。求 \([L,R]\) 的区间中满足这些条件的数的平方和。

\(Sample\) \(Input:\)

3
1 9
10 11
17 17

\(Sample\) \(Output:\)

236
221
0

\(Solution:\)

这题老好玩了,坑了我一个早上,发现他要咱们求得是平方和。

好像不可做的样子,看了看题解,其实也没有想象的那么难写。

但是我们要把一些别的推导出平方和的东西记录下来。

考虑已经求出了后面的几位数的数字,是 \(f_i\)

那么当前这个数是 \(x\)

那么平方和为

\(\sum_{i=1}^{n}(x+f_i)^2=\sum_{i=1}^{n}(x^2+2*f_i*x+(f_i)^2)\)

拆除 \(sigma\)

\(\sum=n*x^2+2*x*\sum_{i=1}^{n}f_i+\sum(f_i)^2\)

那么我们只要记录

当前后几位组成的数有几个 :\(cnt\) ,

后面几个数的和 \(sum\) ,

上一次的平方和 \(sqr\),

那么就可以转移了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,T;
const int N=25,M=10,p=1e9+7;
int a[N];
int digit[N];
struct node{
    int cnt;
    int sum;
    int sqr;
    bool exist;
    inline void clear() {
        cnt=sum=sqr=0;
        exist=false;
    }
}c,b,f[N][M][M];
inline node dfs(int len,int res,int sum,bool limit){
    if(len<=0) {
        node tmp;tmp.clear();
        if(res && sum){
            tmp.cnt=1;
            return tmp;
        }
        return tmp;
    }
    if(!limit && f[len][res][sum].exist) return f[len][res][sum];
    node ret;ret.clear();

    int up_bound=(limit)?digit[len]:9;

    for(int i=0;i<=up_bound;++i){
        if(i==7) continue;
        node x; x.clear();
        int tmp=(a[len-1]*i)%p;
        x=dfs(len-1,(res+i)%7,(sum*10+i)%7,limit && (i==up_bound));
        ret.cnt+=x.cnt;
        ret.cnt%=p;

        ret.sum+=(x.sum+(tmp*x.cnt)%p)%p;
        ret.sum%=p;

        ret.sqr+=((x.cnt*tmp)%p*tmp)%p;
        ret.sqr%=p;
        ret.sqr+=((2*tmp)%p*x.sum)%p;
        ret.sqr%=p;
        ret.sqr+=x.sqr;
        ret.sqr%=p;
    }
    if(!limit) f[len][res][sum]=ret,f[len][res][sum].exist=true;
    return ret;
}
inline node solve(int x){
    int cnt=0;
    memset(f,0,sizeof(f));
    while(x){
        digit[++cnt]=x%10;
        x/=10;
    }
    return dfs(cnt,0,0,true);
}
signed main(){
    a[0]=1;
    for(int i=1;i<=20;++i) a[i]=(a[i-1]*10)%p;
    scanf("%lld",&T);
    while(T--){
        int l=0,r=0;
        scanf("%lld%lld",&l,&r);
        c=solve(r);
        b=solve(l-1);
        printf("%lld\n",((c.sqr-b.sqr)%p+p)%p);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/JCNL666/p/10734253.html

时间: 2024-11-05 16:37:16

【题解】吉哥系列故事——恨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不成妻

吉哥系列故事――恨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有关!所以,他现在甚至讨

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的整数

B - 吉哥系列故事——恨7不成妻

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

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 ACM 4507 吉哥系列故事——恨7不成妻 -&gt;数位DP

题意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关-- 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和. 分析:数位DP,关键内容如下. (pre0+i)%7用于处理各个位数之和时候为7的倍数,(pre1*10+i)%7用于处理这个数是否为7的倍数. #include<iostream> using namespace std; const __int64 mod=100

HDU4507 吉哥系列故事——恨7不成妻 题解 数位DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7': 不能被 7 整除: 各位之和不能被 7 整除. 注意:求的是满足条件的数的 平方和 ! 解题思路: 使用 数位DP 尽情求解. 但是因为这里求的是满足要求的元素的平方和,而不是元素的个数. 所以我们不能简单地开long long来存放结果, 而是开一个结构体来存放结果,结构体中需要包含三个元素:

hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模

http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 首先想到数位DP,我们看下如何维护. 最基本的dp需要两维来维护起始数字和长度,此外对于数位求和mod 7的余数需要一维来维护,对于一个数mod 7的余数需要一维维护. 此外我们处理一下平方和,对于一个x开头,长度为len的xoo型数集,把它分成