【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,他都讨厌! 吉哥 ...
随机推荐
- BZOJ1879_Bill的挑战_KEY
题目传送门 第一次看题目感觉毫无还手之力,一看M的范围≤15,果断状压. 但是状压的想法比较新奇. 先想到的状压是设f[i][j]表示前i个状态为j时的方案总数,但是后来想了一想不行,会超时. 于是以 ...
- P1209 [USACO1.3]修理牛棚 Barn Repair
P1209 [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. ...
- CC3200-LAUNCHXL驱动不能正常识别的问题
1. 本次使用利尔达的CC3200底板,完全兼容官方CC3200-LAUNCHXL,如果上电之后驱动识别为2路串口,是有问题的.原因是FT2232外接的EEPROM没有烧写固件. 2. 安装FT_Pr ...
- MyBatis-mybatis全局映射文件解析
全局配置文件为mybatis-config.xml 1.properties标签 <properties resource="dbconfig.properties"> ...
- Myeclipse - 问题集 - specified vm install not found
In Eclipse, click the ant file -- Run As -- External Tools Configuration and click on the JRE tab. S ...
- 通过批处理命令for提取数据
前两天有这么个小需求: 在cmd中运行某测试工具后,会返回一个json结果,其中有一个参数的值每次都变且经常要用,正常情况复制粘贴就好了,但这个值非常长,配上cmd的标记+粘贴的行为,就很酸爽了.然后 ...
- 关于maven项目中修改的JS不生效的解决方案
1. 问题描述 昨天下午博主在开发学习的过程中,碰到一个修改了JS无法生效的问题,折腾我不少的时间,现将百度到的解决方案总结一下,以便下次碰到类似问题能够最快的找到解决方案 2 解决方案 2.1 方案 ...
- lintcode433 岛屿的个数
岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 您在真实的面试中是否遇到过这个题? Yes 样例 在矩阵: ...
- Python基础 之 tuple类-元组 和 dict类-字典
tuple 元组 一.tuple 类的基本属性 1.元组,有序:元素不可被修改,不能被增加或者删除tuple类 tu = (111,22,33,44) 一般写元组的时候,推荐在最后加入,和类方法进行区 ...
- 【Linux 运维】 安装PHP工具Composer
一.安装PHP 由于Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的 ...