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,他都讨厌! 吉哥 ...
随机推荐
- js原型链原理
先附上原型链的图,能看懂的本文就没必要看了,看不懂的可以带着疑问看文章 一.构造函数 什么是构造函数:当一个普通函数创建一个类对象是,那么就程它为构造函数. 特点: 默认首字母大写 使用new关键字来 ...
- Mac安装homebrew,postman,charles
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 1. ...
- ctfhub技能树—文件上传—00截断
什么是00截断 相关教程:http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88 ...
- 用其他主机docker login登录Harbor仓库报错
做微服务的时候,我准备把编译好的jar包,部署到我的Harbor仓库上,却登录不上去,出现以下报错: [root@k8s-master ~]# docker login 192.168.30.24Us ...
- web项目启动链接mysql巨慢
说明:项目部署到测试服务器上,mysql部署在另一台服务器上,项目第一次启动之后登陆后台很慢,大概30s左右,经查发现第一次访问数据库的时候会通过DNS解析客户端机器域名,mysql还有DNS反向解析 ...
- HTTP Keep-Alive模式客户端与服务器如何判定传输完成
目录 长连接是什么 服务器如何知道已经完全接受客户端发送的数据 客户端如何知道已经完全接受服务端发送的数据 Transfer-Encoding transfer-coding与Content-Leng ...
- PC端微信多开方式.bat(Windows批处理文件)
start 微信安装路径\WeChat.exe start 微信安装路径\WeChat.exe
- 数据备份与恢复 半持久化 全持久化 fork aof rdb Backing up Disaster recovery 备份 容灾
Redis数据备份与恢复 - 流年晕开时光 - 博客园 https://www.cnblogs.com/deny/p/11531355.html Redis数据备份与恢复 Redis所有数据都是保存在 ...
- javamail发送邮件,支持yahoo,google,163.com,qq.com邮件发送
https://www.iteye.com/blog/fangyunfeng-1847352 https://blog.csdn.net/weixin_38465623/article/details ...
- 理解 async/await以及对Generator的优势
async await 是用来解决异步的,async函数是Generator函数的语法糖使用关键字async来表示,在函数内部使用 await 来表示异步async函数返回一个 Promise 对象, ...