题目描述

求 $[L,R]$ 内满足:数位中不包含7、数位之和不是7的倍数、本身不是7的倍数 的所有数的平方和 mod $10^9+7$ 。

输入

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

输出

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

样例输入

3
1 9
10 11
17 17

样例输出

236
221
0


题解

数位dp

由于要求数位之和不是7的倍数,因此要维护数位之和模7的值。

由于要求本身不是7的倍数,因此要维护本身模7的值。

所以设 $f[i][j][k][l]$ 表示 $i$ 位数,最高位为 $j$ ,数位之和模7为 $k$ ,本身模7为 $l$ ,且数位中不出现7的......的什么?

题目所求为平方和,而每个数都加上一个数后,平方和不能直接加。

考虑到一个公式: $(a+b)^2=a^2+2ab+b^2$ ,因此 $\sum(a+v)^2=\sum a^2+2v\sum a+v^2\sum a^0$ ,所以维护0次方和(即个数)、1次方和及2次方和即可实现给每个数加上一个数。

具体可以使用结构体维护。

然后就是数位dp的老套路:先处理位数不满的,统计到答案中;然后从高位到低位枚举第几位,该位小于原数的该位则一定满足区间条件,把符合条件的数加到答案中。

本题中dp时需要记录前面的数位之和、前面的数(加到答案时还需要加上该数),并且当出现7时直接跳出。

把询问转化为 $[1,n)$的区间更容易一些。

注意一下 $10^{19}$ 爆long long,因此找位数时还要判断当位数等于19时直接跳出(比竟无法存储 $10^{19}$ )。

同时还要注意一下取模问题。

#include <cstdio>
#define mod 1000000007
typedef long long ll;
struct data
{
ll v[3];
ll &operator[](ll a) {return v[a];}
data() {v[0] = v[1] = v[2] = 0;}
data operator+=(data a)
{
v[0] = (v[0] + a[0]) % mod;
v[1] = (v[1] + a[1]) % mod;
v[2] = (v[2] + a[2]) % mod;
return *this;
}
data operator+(ll a)
{
data ans;
a %= mod;
ans[0] = v[0];
ans[1] = (v[1] + a * v[0]) % mod;
ans[2] = (v[2] + 2 * a * v[1] + a * a % mod * v[0]) % mod;
return ans;
}
}f[19][10][7][7];
ll b[19];
void init()
{
int i , j , k , l , m;
f[0][0][0][0][0] = b[0] = 1;
for(i = 1 ; i < 19 ; i ++ )
{
b[i] = b[i - 1] * 10;
for(j = 0 ; j < 10 ; j ++ )
for(k = 0 ; k < 10 ; k ++ )
for(l = 0 ; l < 7 ; l ++ )
for(m = 0 ; m < 7 ; m ++ )
if(j != 7)
f[i][j][(l + j) % 7][(m + j * b[i - 1]) % 7] += f[i - 1][k][l][m] + j * b[i - 1];
}
}
ll calc(ll n)
{
int i , j , k , l , s = 0 , now , di = 1;
ll v = 0;
data ans;
for(i = 1 ; i < 19 && b[i] <= n ; i ++ )
for(j = 1 ; j < 10 ; j ++ )
for(k = 1 ; k < 7 ; k ++ )
for(l = 1 ; l < 7 ; l ++ )
ans += f[i][j][k][l];
for( ; i ; i -- )
{
now = n / b[i - 1] % 10;
for(j = di ; j < now ; j ++ )
for(k = 0 ; k < 7 ; k ++ )
for(l = 0 ; l < 7 ; l ++ )
if((k + s) % 7 && (l + v) % 7)
ans += f[i][j][k][l] + v;
if(now == 7) break;
s = (s + now) % 7 , v += now * b[i - 1] , di = 0;
}
return ans[2];
}
int main()
{
init();
int T;
ll n , m;
scanf("%d" , &T);
while(T -- ) scanf("%lld%lld" , &n , &m) , printf("%lld\n" , (calc(m + 1) - calc(n) + mod) % mod);
return 0;
}

【hdu4507】吉哥系列故事——恨7不成妻 数位dp的更多相关文章

  1. hdu4507吉哥系列故事——恨7不成妻 (数位dp)

    Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...

  2. HDU-4507 吉哥系列故事——恨7不成妻 数位DP

    题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...

  4. hdu4507 吉哥系列故事——恨7不成妻[数位DP]

    这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...

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

    吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others)   ...

  6. [HDU4507]吉哥系列故事——恨7不成妻

    [HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...

  7. 2018.09.27 hdu4507吉哥系列故事——恨7不成妻(数位dp)

    传送门 一道比较综合的数位dp. 维护三个值:[L,R][L,R][L,R] 区间中与7无关的数的数量,与7无关的数之和,与7无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7' ...

  9. 吉哥系列故事——恨7不成妻(数位dp)

    吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...

随机推荐

  1. 日期插件Mobiscroll

    http://mobiscroll.com/ http://www.cnblogs.com/hxling/archive/2012/12/12/2814207.html http://www.wglo ...

  2. 每天看一片代码系列(四):layzr.js,处理图片懒加载的库

    所谓图片的懒加载,即只有当图片处于或者接近于当前视窗时才开始加载图片.该库的使用方法非常简单: var layzr = new Layzr({ attr: 'data-layzr', // attr和 ...

  3. ORB-SLAM(十一)EPnP

    EPnP在ORB-SLAM中主要用于Tracking线程中的重定位Relocalization模块,需要通过当前关键帧Bow与候选帧匹配上的3D地图点,迅速建立当前相机的初始姿态. PnP问题解决了已 ...

  4. VueJs 学习笔记

    VueJs学习笔记 参考资料:https://cn.vuejs.org/ 特效库:TweenJS(补间动画库)  VelocityJS(轻量级JS动画库) Animate.css(CSS预设动画库) ...

  5. 92套AE抖音快闪模板(精品)

    包含很多场景和类型,直接用即可,下载地址:百度网盘,https://pan.baidu.com/s/1bRFql1zFWyfpTAwa6MhuPA 内容截图:    

  6. 第三篇 JavaScript基础

    知识预览 BOM对象 DOM对象(DHTML) 实例练习 转:https://www.cnblogs.com/yuanchenqi/articles/5980312.html#_label2 一.Ja ...

  7. Unity制作人物头像小图标和小地图

    人物头像的制作: 在场景中添加人物模型和环境模型 设置人物的layer为Player 在主摄像机的基础上,新建一个次摄像机并将摄像机镜头对准人物面部,调整至合适大小. 设置次摄像机 culling m ...

  8. 了解Python控制流语句——for 循环

    for 循环 Python教程中for...in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),意即它会遍历序列中的每一个项目.我们将在后面的Python序列(Seque ...

  9. DP动态规划练习

    先来看一下经典的背包问题吧 http://www.cnblogs.com/Kalix/p/7617856.html  01背包问题 https://www.cnblogs.com/Kalix/p/76 ...

  10. 关于Python3中函数:

    # 关于Python3中函数: - 定义 定义函数使用关键字def,后接函数名和放在圆括号()中的可选参数列表,函数内容以冒号起始并且缩进.一般格式如下:``` def 函数名(参数列表): &quo ...