hdu4507吉哥系列故事——恨7不成妻 (数位dp)
依然单身!
吉哥依然单身!
DS级码农吉哥依然单身!
所以,他生平最恨情人节,不管是214还是77,他都讨厌!
吉哥观察了214和77这两个数,发现:
2+1+4=7
7+7=7*2
77=7*11
最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数!
什么样的数和7有关呢?
如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关——
1、整数中某一位是7;
2、整数的每一位加起来的和是7的整数倍;
3、这个整数是7的整数倍;
现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和。
1 9
10 11
17 17
221
0
感悟:数位dp还是用记忆化搜索好。
思路:用dp[i][j][k]表示第i位(这里的前i位指的是从len位循环到第i位的状态)前面几位位数和%7的值为j,前面所代表十进制数%7的状态。这个状态用一个结构体node 表示,node里面记录的是这个状态下后面符合条件的数的个数,和,平方和。为什么要记录这三个呢?是因为平方和能用它们三个表示。对于一个十进制数,比如756,756^2=(700+56)^2=700^2+56^2+2*700*56,所以就可以推得规律:
ans.cnt+=temp.cnt;
ans.sum+=temp.cnt*j*p[pos-1 ]+temp.sum; //p[pos-1]=10^(pos-1)
ans.sqsum+=temp.sqsum+2*(p[pos-1]*temp.sum*j)+p[pos-1]*p[pos-1]*temp.cnt*j*j;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define MOD 1000000007
struct node{
ll cnt; //个数
ll sum; //总和
ll sqsum; //所有符合数的前面部分平方和
}dp[25][11][11]; //前i位,位数和%7为j,值和%7为k
ll p[25];
void init(){
int i,j;
p[0]=1;
for(i=1;i<=20;i++){
p[i]=(p[i-1]*10)%MOD;
}
}
int wei[30];
node dfs(ll pos,ll num,ll sum,ll flag)
{
int i,j;
node ans;
ans.cnt=ans.sum=ans.sqsum=0;
if(pos==0){
if(flag=1 && num!=0 && sum!=0){
ans.cnt=1;
}
return ans;
}
if(!flag && dp[pos][num][sum].cnt!=-1){
return dp[pos][num][sum];
}
int ed;
if(flag)ed=wei[pos];
else ed=9;
for(j=0;j<=ed;j++){
if(j==7)continue;
node temp=dfs(pos-1,(j+num)%7,(sum*10+j)%7,flag&&(j==ed) );
ans.cnt+=temp.cnt;
ans.cnt%=MOD;
ans.sum+=(temp.cnt*j%MOD*p[pos-1 ]%MOD+temp.sum )%MOD;
ans.sum%=MOD;
ans.sqsum+=(temp.sqsum+2*(p[pos-1]*temp.sum%MOD*j)%MOD )%MOD;
ans.sqsum%=MOD;
ans.sqsum+=(p[pos-1]*p[pos-1]%MOD*temp.cnt%MOD*j*j)%MOD;
ans.sqsum%=MOD;
}
if(!flag){
dp[pos][num][sum]=ans;
}
return ans;
}
node solve(ll x)
{
int i,j,k,len=0;
ll t=x;
while(t){
wei[++len]=t%10;
t/=10;
}
for(i=0;i<20;i++){
for(j=0;j<9;j++){
for(k=0;k<9;k++){
dp[i][j][k].cnt=-1;
}
}
}
return dfs(len,0,0,1);
}
int main()
{
int i,j,T;
ll n,m;
init();
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&m,&n);
printf("%lld\n",((solve(n).sqsum-solve(m-1).sqsum)%MOD+MOD)%MOD );
}
}
hdu4507吉哥系列故事——恨7不成妻 (数位dp)的更多相关文章
- 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不成妻 数位dp
题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...
- [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,他都讨厌! 吉哥 ...
随机推荐
- mac安装Navicat Premium Mac 12 破解版
参考:https://www.cnblogs.com/lyfstorm/p/11123159.html 激活后:
- /etc/hosts文件
这个文件告诉主机哪些域名对应哪些ip,哪些主机名对应哪些ip. 一般也三个域 网络ip地址 主机名或域名 主机名别名 两部分的时候 主机ip地址和主机名
- 【RAC】11gRAC 搭建(VMware+裸设备)
安装环境与网络规划 安装环境 主机操作系统:windows 7虚拟机VMware12:两台Oracle Linux R6 U5 x86_64 Oracle Database software: Ora ...
- linux命名小技巧(持续更新)
一 向某个文件批量加入内容 1.1 向/etc/wxm文件添加一大段内容可以使用这个命令 [root@registry easyrsa3]# cat <<EOF >varsset ...
- 攻防世界—pwn—cgpwn2
题目分析 题目提示 checksec检查文件保护机制 使用ida查看伪代码 hello函数存在溢出,与level2类似 信息收集 system地址 name的地址 编写脚本 from pwn impo ...
- java 不利用第三个变量的情况下将值互换
package com.zcj.eg001; public class VarChange { public static void main(String[] args) { int a = 10; ...
- Tensorflow-基础使用
Tensorflow基本概念 使用图(graphs)来表示计算任务 在被称之为会话(Session)的上下文(context)中执行图 使用tensor表示数据 通过变量(Variable)维护状态 ...
- Spring Security,没有看起来那么复杂(附源码)
权限管理是每个项目必备的功能,只是各自要求的复杂程度不同,简单的项目可能一个 Filter 或 Interceptor 就解决了,复杂一点的就可能会引入安全框架,如 Shiro, Spring Sec ...
- UDP flood UDP Port Denial-of-Service Attack
https://baike.baidu.com/item/UDP%20flood/5504851 UDPFlood是日渐猖厥的流量型DoS攻击,原理也很简单.常见的情况是利用大量UDP小包冲击DNS服 ...
- Linux进程内存用量分析之堆内存篇
https://mp.weixin.qq.com/s/a6mLMDinYQGUSaOsGYCEaA 独家|Linux进程内存用量分析之堆内存篇 姬晨烜 58技术 2019-12-06 导语 本文将介绍 ...