HDU-4507-吉哥系列故事-恨7不成妻
题目描述
单身!
依然单身!
吉哥依然单身!
DS级码农吉哥依然单身!
所以,他生平最恨情人节,不管是214还是77,他都讨厌!
吉哥观察了214和77这两个数,发现:
2+1+4=7
7+7=7*2
77=7*11
最终,他发现原来这一切归根到底都是因为和\(7\)有关!所以,他现在甚至讨厌一切和7有关的数!
什么样的数和\(7\)有关呢?
如果一个整数符合下面\(3\)个条件之一,那么我们就说这个整数和\(7\)有关——
- 整数中某一位是\(7\);
- 整数的每一位加起来的和是\(7\)的整数倍;
- 这个整数是\(7\)的整数倍;
现在问题来了:吉哥想知道在一定区间内和\(7\)无关的数字的平方和。
Input
输入数据的第一行是\(case\)数\(T(1 <= T <= 50)\),然后接下来的\(T\)行表示\(T\)个\(case\);
每个\(case\)在一行内包含两个正整数\(L, R(1 <= L <= R <= 10^{18})\)。
Output
请计算\([L,R]\)中和\(7\)无关的数字的平方和,并将结果对\(10^{9}+7\)求模后输出。
Sample Input
3
1 9
10 11
17 17
Sample Output
236
221
0
数位\(dp\)题。
以前,我们遇到的数位\(dp\)题,都是求区间满足条件的数的个数。
那区间平方和怎么维护呢?
其实,区间平方和也可以做差求解。
那么,\(dp\)的同时需要维护\(3\)个值,开个结构体存一下就行了。
让我们一位位的进行计算。
1.满足条件的数的个数。这个利用普通的数位\(dp\)去维护就行了。
2.满足条件的数的和。这个维护时,加上子状态的值,以及该状态的位数和子状态的个数。
\(12=(1*10^{1}+2*10^{0})\)
因为我们枚举当前的位置\(x\)上放了\(i\),则i在原数中对应\(i*10^{x}\)
\(1\)是你当前枚举的数字,\(2*10^{0}\)是你子状态的答案,所以状态的转移也就出来了。
当前sum=子状态sum+当前位的数字\(10^{当前位数}\)子状态个数。
3.满足条件的数的平方和。这个维护时,加上子状态的值,以及该状态的位数和子状态的个数。
\(12^{2}=(1*10^{1}+2*10^{0})^{2}\)
\(12^{2}=1^{2}*(10^{1})^{2}+(2*10^{0})^{2}+2*(2*10^{0})*(1*10^{1})\)
让我们回顾一下平方和公式:
\((a+b)^{2}=a^{2}+b^{2}+2*a*b\)
\(a\)就是当前位\(i*10^{当前位数}\),\(b\)是子状态和。
状态的转移也就出来了。
当前平方和=子状态平方和+\(2*i∗10^{当前位数}*子状态和\)+\((i∗10^{当前位数})^{2}*子状态个数\)
注意,取模后记得负数要加上模数再取模。
代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mod=1000000007;
int T,num[25];
long long a,b,pow[20]={0,1};
struct node {
long long cnt,sum,qsum;
} dp[25][15][15];
node dfs(int pos,int mod1,int mod2,int limit) {
if(pos==0)return <%mod1&&mod2,0,0%>;
if(!limit&&dp[pos][mod1][mod2].cnt!=-1)return dp[pos][mod1][mod2];
int up=limit?num[pos]:9;
node res=<%0,0,0%>;
for(int i=0; i<=up; i++) {
if(i==7)continue;
node temp=dfs(pos-1,(mod1+i)%7,(mod2*10+i)%7,limit&(i==up));
res.cnt=(res.cnt+temp.cnt)%mod;
res.sum=(res.sum+temp.sum)%mod;
res.sum=(res.sum+((i*pow[pos])%mod)*temp.cnt%mod)%mod;
res.qsum=(res.qsum+temp.qsum%mod)%mod;
res.qsum=(res.qsum+((2*pow[pos]*i)%mod*temp.sum%mod)%mod)%mod;
res.qsum=(res.qsum+((pow[pos]*pow[pos])%mod*temp.cnt%mod*(i*i)%mod)%mod);
}
if(!limit)dp[pos][mod1][mod2]=res;
return res;
}
long long solve(long long n) {
int len=0;
while(n)num[++len]=n%10,n/=10;
return dfs(len,0,0,1).qsum;
}
int main() {
scanf("%d",&T);
for(int i=2;i<20;i++)pow[i]=(pow[i-1]*10)%mod;
for(int i=0; i<=20; i++)
for(int j=0; j<=10; j++)
for(int k=0; k<=10; k++)dp[i][j][k]=<%-1,0,0%>;
while(T--) {
scanf("%lld%lld",&a,&b);
printf("%lld\n",(((solve(b)-solve(a-1))%mod+mod)%mod));
}
}
HDU-4507-吉哥系列故事-恨7不成妻的更多相关文章
- HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)
链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...
- HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...
- HDU 4507 吉哥系列故事——恨7不成妻
需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...
- HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)
题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区 ...
- HUD 4507 吉哥系列故事——恨7不成妻
传送门 三个限制都可以数位 $dp$ , $dfs$ 是维护当前位,之前各位总和模 $7$ 意义下的值,之前填的数模 $7$ 意义下的值,是否贴着限制 主要现在求的是各个合法数的平方的和,比较恶心 开 ...
- 吉哥系列故事——恨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这两个数,发 ...
- 吉哥系列故事——恨7不成妻(数位dp)
吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...
- Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507
单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7 ...
- 吉哥系列故事――恨7不成妻 HDU - 4507
题目: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...
随机推荐
- Andorid获取状态栏高度
在应用开发中,有时我们需要用代码计算布局的高度,可能需要减去状态栏(status bar)的高度.状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使 ...
- js下拉框选择图片
二种方式:下拉框里面选项有图片与没有图片 1.用下拉框写 下拉框的option没法添加图片如果下拉框里面不需要图片可以用这种方式. <!DOCTYPE html> <html> ...
- Unity3D_(游戏)2D简单游戏制作过程:捕获高空掉落保龄球
游戏介绍:通过鼠标的左右移动,可以控制帽子的移动,当帽子接到下落的保龄球时,会出现火花效果.没有接到保龄球时,保龄球落到草地上,过10S后会自动消失. 实现效果: 素材+Unity3D源代码:传送 ...
- 分布式-信息方式-JMS可靠性机制
JMS的可靠性机制1.消息接收确认 JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通常包含三个阶段:客户接收消息.客户处理消 ...
- 从零开始学习vue(2)
一.vue实例 每个vue应用都是通过Vue构造函数创建的一个新的实例开始的: var vm = new Vue({ //选项对象 }) 在这其中vm(viewModel的简称)通常都表示vue实例的 ...
- LeetCode 92. 反转链表 II(Reverse Linked List II)
题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, ...
- vmx转换ofv模板,导入esxi
使用VMware Workstation安装目录下\OVFTool文件的ovftool.exe工具: 转换示例: 首先进入OVFTool根目录.然后执行 ovftool.exe "D:\ce ...
- 8.进行图片的裁剪,同时使用resize将图片的维度进行变化
1.img.crop((x1, y1, x2, y2)) 进行图片的裁剪 参数说明: x1, y1, x2, y2 表示图片的大小 2. img.resize((w, h)) # 进行图片的维度变化 ...
- 1.5 log4j使用教程
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下载到Log ...
- leecode 309. 最佳买卖股票时机含冷冻期
/***** //sell[i]表示截至第i天,最后一个操作是卖时的最大收益: //buy[i]表示截至第i天,最后一个操作是买时的最大收益: //cool[i]表示截至第i天,最后一个操作是冷冻期时 ...