【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,他都讨厌! 吉哥 ...
随机推荐
- zipaligin的使用介绍
近来一直在做APK反编译和重编译的工作,针对一些apk需要放入一些相应的文件,(当然这里不涉及非法盈利,都是有合约的),在对一些包打包以后,发现可以通过一个叫做zipalign的工具进行优化,对于这个 ...
- 使用jenkins构建一个maven项目
1.登陆到jenkins首页,创建项目-->选择maven-->输入项目名称-->选择项目类型 2.进入项目配置:{先写一下项目描述和设置下保留的历史构建,然后向下拉} 找到源吗管理 ...
- typescript 学习记录
类型判断: typeJudge() { //typeof 用来判断变量类型 var s: string = 'egret'; var isString: boolean = typeof s === ...
- LeetCode 135——分发糖果
1. 题目 2. 解答 初始化左序奖赏全为 1,从左往右遍历,如果右边的人评分比左边高,右边奖赏比左边奖赏增 1. 初始化右序奖赏全为 1,从右往左遍历,如果左边的人评分比右边高,左边奖赏比右边奖赏增 ...
- LeetCode - 463. Island Perimeter - O(MN)- (C++) - 解题报告
原题 原题链接 You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 ...
- mweb test
目录 Markdown syntax guide and writing on MWeb Philosophy Notice Headers This is an <h1> tag Thi ...
- truffle框架快速开发合约步骤
矩阵元区块链智能合约开发指南 1 适用范围 本规范描述了矩阵元区块链系统智能合约的开发约束与规范,用以指导DAPP开发者按照本规范开发基于矩阵元区块链运行的应用. 2 术语解释 术语 术语解释 DAP ...
- 一些容易记混的c++相关知识点
一些容易记混的c++相关知识. 截图自:<王道程序员面试宝典>
- canvas学习(三):文字渲染
一.绘制基本的文字: var canvas = document.getElementById("myCanvas") var ctx = canvas.getContext('2 ...
- android仿win8
在 eoe上偶然发现已经有人实现了这个功能的源码(地址:http://www.eoeandroid.com /forum.php?mod=viewthread&tid=327557),马上下载 ...