【hdu4507】吉哥系列故事——恨7不成妻 数位dp
题目描述
求 $[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的更多相关文章
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...
- HDU-4507 吉哥系列故事——恨7不成妻 数位DP
题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...
- hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模
http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...
- hdu4507 吉哥系列故事——恨7不成妻[数位DP]
这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...
- 吉哥系列故事——恨7不成妻(数位DP)
吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others) ...
- [HDU4507]吉哥系列故事——恨7不成妻
[HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...
- 2018.09.27 hdu4507吉哥系列故事——恨7不成妻(数位dp)
传送门 一道比较综合的数位dp. 维护三个值:[L,R][L,R][L,R] 区间中与7无关的数的数量,与7无关的数之和,与7无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
- HDU4507 吉哥系列故事——恨7不成妻 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7' ...
- 吉哥系列故事——恨7不成妻(数位dp)
吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...
随机推荐
- 路由追踪:traceroute/tcptraceroute
一.工作原理 traceroute:IP路由过程中对数据包TTL(Time to Live,存活时间)进行处理.当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变 ...
- Redis系列五 Redis持久化
Redis持久化 一.RDB(Redis DataBase) 1.介绍 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Red ...
- PostFix支持SMTP认证
安装cyrus-sasl yum -y install cyrus-sasl* 启动服务,开机启动 service saslauthd start chkconfig saslauthd on 配置p ...
- 一种新的自动化 UI 测试解决方案 Airtest Project
今天分享一个自动化UI测试工具airtest——一款网易出品的基于图像识别面向游UI测试的工具,也支持原生Android App基于元素识别的UI自动化测试.主要包含了三部分:Airtest IDE. ...
- Selenium(Python)页面对象+数据驱动测试框架
整个工程的目录结构: 常用方法类: class SeleniumMethod(object): # 封装Selenium常用方法 def __init__(self, driver): self.dr ...
- VMware SDK使用指南
刚开始用VMware官方推荐的SDK,真的是又臭又长,代码结构不清晰,易读性差.后来VMware的同学给推荐了一款开源的SDK,一上手感觉工作效率提高了100倍!推荐大家使用~. 该SDK对VMwar ...
- 【text】 文本组件说明
text文本组件:在小程序里除了文本节点以外的其他节点都无法长按选中. 原型: <text selectable="[Boolean]" space="[ensp ...
- ObjectMapper的使用
Jackson ObjectMapper类 ObjectMapper类是Jackson库的主要类它提供一些功能将Java对象转换成JSON结构,反之亦然它使用JsonParser和JsonGenera ...
- 集合栈计算机 (The SetStack Computer,ACM/ICPC NWERC 2006,UVa12096
题目描述: #include<iostream> #include<string> #include<set> #include<map> #inclu ...
- [Clr via C#读书笔记]Cp17委托
Cp17委托 简单介绍 delegate回调函数机制,可以理解存储函数地址的变量类型: 类型安全: 引用类型支持逆变和协变: 回调 静态方法,实例方法 委托的本质 所有的委托都派生自System.Mu ...