hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模
http://acm.hdu.edu.cn/showproblem.php?pid=4507
求[L,R]中不满足任意条件的数的平方和mod 1e9+7。
条件:
1、整数中某一位是7;
2、整数的每一位加起来的和是7的整数倍;
3、这个整数是7的整数倍;
首先想到数位DP,我们看下如何维护。
最基本的dp需要两维来维护起始数字和长度,此外对于数位求和mod 7的余数需要一维来维护,对于一个数mod 7的余数需要一维维护。
此外我们处理一下平方和,对于一个x开头,长度为len的xoo型数集,把它分成x*10^(len-1)+oo两部分,平方展开(x*10&(len-1))^2+2*(x*10^(len-1))*oo+oo^2,而我们要得到的是上式对于每一个oo的组合。
第一项的系数应该是oo的种类数(即最基本的数位DP计数)。
第二项的可以转化为2*(x*10^(len-1))*(oo1+oo2+...),即我们维护一下oo所有取值的和(维护方式类比维护平方)。
第三项即oo^2的和,我们递归地维护一下。
所以最后一维我们开[3]来维护基本数位计数,数值和,数值平方和。
对于出现7的处理,会做数位DP都会处理。
此题数据很接近long long max,请仔细取余(还得分%7 %1e9+7),不要偷懒~
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
const LL N = ;
const LL INF = ;
const LL mod = 1e9+;
const LL Len = ;
LL dp[Len][][][][];//bit,num,bitmod,valmod,sum(type: 0.cntSum 1.valSum 2.powSum
LL bit[Len];
LL bitMod7[Len];
void init()
{
memset(dp, , sizeof dp);//初始化为0
for (LL i = ; i < ; i++)
{
if (i == )continue;
dp[][i][i % ][i % ][] = ;
dp[][i][i % ][i % ][] = i;
dp[][i][i % ][i % ][] = i*i;
}
bit[] = ;
bitMod7[] = ;
for (LL i = ; i < Len; i++)
{
bit[i] = bit[i - ] * ;
bit[i] %= mod;
bitMod7[i] = bitMod7[i - ] * ;
bitMod7[i] %= ;
}
for (LL len = ; len < Len; len++)
{
for (LL i = ; i < ; i++)
{
if (i == )continue;
for (LL m = ; m < ; m++)
{
for (LL sm = ; sm < ; sm++)
{
LL aim = (m + i) % ;//bitsum
LL aism = (sm + i*bitMod7[len]) % ;//valsum
for (LL j = ; j < ; j++)
{
if (j == ) continue;
dp[len][i][aim][aism][] += dp[len - ][j][m][sm][];
dp[len][i][aim][aism][] %= mod;
dp[len][i][aim][aism][] += dp[len - ][j][m][sm][];
dp[len][i][aim][aism][] %= mod;
dp[len][i][aim][aism][] +=(((dp[len - ][j][m][sm][] * i) % mod)*bit[len]) % mod;
dp[len][i][aim][aism][] %= mod;
dp[len][i][aim][aism][] += dp[len - ][j][m][sm][];
dp[len][i][aim][aism][] %= mod;
dp[len][i][aim][aism][] += (((((dp[len - ][j][m][sm][] * ) % mod)*i) % mod)*bit[len]) % mod;
dp[len][i][aim][aism][] %= mod;
dp[len][i][aim][aism][] += ((((((dp[len - ][j][m][sm][] * i) % mod*i) % mod)*bit[len]) % mod) * bit[len]) % mod;
dp[len][i][aim][aism][] %= mod;
}
}
}
}
}
}
LL arr[];//当前求解的数的分解
LL dfs(LL pos, LL preMod,LL presum,LL prebit)
{
if (pos == -)return ;//尾部
LL num = arr[pos];//获取当前数
LL cnt = ;//计算以pre为前缀,后面从0~num-1开头的所有情况
for (LL i = ; i < num; i++)
{
if (i == )continue;
for (LL m = ; m < ; m++)
{
if ((m + prebit)% == ) continue;
for (LL sm = ; sm < ; sm++)
{
if ((presum + sm) % == ) continue;
//cout<<preMod<<' '<<dp[pos][i][m]
cnt += (((preMod*preMod) % mod)*dp[pos][i][m][sm][])%mod;
cnt %= mod;
cnt += ((( * preMod)%mod)*dp[pos][i][m][sm][])%mod;
cnt %= mod;
cnt += dp[pos][i][m][sm][];
cnt %= mod;
}
}
}
if (num == )return cnt%mod;
return (cnt + dfs(pos - , (preMod+num*bit[pos])%mod,(presum+num*bitMod7[pos])%,(prebit+num)%)%mod)%mod;//下一级dfs传递前缀(对于不同题目需要传递的前缀信息不同)
}
LL sol(LL x)
{
if (x == ) return ;
x++;//dfs在求解时,只能解出x-1的所有情况,x需要在递归尾部特判,干脆我们将x++,这样正好求出x
LL siz = ;
while (x)
arr[siz++] = x % , x /= ;
LL ans = ;
ans = dfs(siz - ,,,);
return ans;
}
int main() {
cin.sync_with_stdio(false);
LL n, m;
init();
int t;
cin >> t;
while (t--)
{
cin >> n >> m;
cout << ((sol(m) - sol(n - ))%mod+mod)%mod << endl;
}
return ;
}
hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模的更多相关文章
- 吉哥系列故事——恨7不成妻(数位DP)
吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others) ...
- HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)
链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了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],问在此区 ...
- HDU-4507 吉哥系列故事——恨7不成妻 数位DP
题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...
- 【hdu4507】吉哥系列故事——恨7不成妻 数位dp
题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...
- hdu4507 吉哥系列故事——恨7不成妻[数位DP]
这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...
随机推荐
- 运行django新的项目,页面总是显示以前的项目,问题解决
运行django新的项目,页面总是显示以前的项目 只需打开任务管理器,再进程中关闭python.exe 再次重新启动服务,python manage.py runserver.即可
- css的再深入4(更新中···)
两种居中的方式: Margin:0 auto;和text-align:center; Margin的居中是对自身,text-align对元素内部的文本来说. 隐藏的两种方式: visibility:h ...
- SpringCloud与Consul集成实现负载均衡
一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构如下: 二.Co ...
- 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning
论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning 2017-06-06 21: ...
- Java 11 究竟比 8 快了多少?看看这个基准测试
开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版本是 8,所以测试者用 Java 8 与 Java 11 进行对比测试 ...
- facebook api之Access and Authentication
Access and Authentication There are three access levels to the Marketing APIs. You can upgrade acces ...
- EPPlus实战篇——Excel写入
.net core 项目 可以向excel写入任何类型(T)的数据,只要T中的field的[Display(Name = "1233", Description = "# ...
- Linux 命令之sed
简介 sed 是一种在线编辑器,它一次处理一行内容.在处理的时候,会先把当前处理的行存储在临时缓冲区,这被称之为 "末世空间", 然后再使用 sed 命令处理缓冲区的内容,处理完成 ...
- 【Django】【二】模板
1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...
- unity shader base pass and additional pass
[Unity Shaders]Shader中的光照,shadersshader 写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已 ...