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$,数字取余 ...
随机推荐
- ChromeDriver与Chrome版本对应关系
备注: 下载ChromeDriver的时候,可以在notes.txt文件中查看版本对应关系. ----------ChromeDriver v2.29 (2017-04-04)---------- S ...
- 开源代码中的autogen.sh干了些什么?
答:重新根据当前所处环境生成新的configure 分析脚本都做了些什么? 1. 指定make工具 MAKE=gmake or MAKE=make 2. 执行autoreconf autoreconf ...
- apache安装时的一些术语
apache源码安装时,需要的哪些必须依赖模块? 主要需要apr, apr-util, pcre模块 其中 apr模块时必须的. 如何卸载 源码安装的软件? 在源码 的 解压目录下, 使用 make ...
- 比较好的MySQL索引原理
MySQL索引原理及慢查询优化 - 美团技术团队 https://tech.meituan.com/2014/06/30/mysql-index.html
- Java中 System.arraycopy() 和 Arrays.copyOf()方法
System.arraycopy() 和 Arrays.copyOf()方法 阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法.比如:我们上面讲的扩容操作以及add(int in ...
- (zhuan) 一些RL的文献(及笔记)
一些RL的文献(及笔记) copy from: https://zhuanlan.zhihu.com/p/25770890 Introductions Introduction to reinfor ...
- RequestMethod用法小结和注意事项
本文为博主原创,未经允许不得转载: RequestMethod为在@RequestMapping注解中使用的一个属性,用来标识请求的方法类型,可参考@RequestMapping源码: @Target ...
- [转载]解决linux 下多线程错误 undefined reference to `sem_init'
转自:https://blog.csdn.net/yzycqu/article/details/7396498?utm_source=copy 解决linux 下多线程错误 undefined ref ...
- 封装fetch的使用(包含超时处理)
// 1: 传统fetch操作 fetch('http://facebook.github.io/react-native/movies.json') .then((response) => r ...
- Pandas 基础(3) - 生成 Dataframe 的几种方式
这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...