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$,数字取余 ...
随机推荐
- easyui中datagrid常见功能
1.数据加载,需要拼接成标准json格式{}.如果是jsonarray格式[{},{}],无法识别. 2.后端将list拼接成datagrid能识别的json格式,需要首先new JSONObject ...
- EGIT
https://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html
- scrapy - Request 中的回调函数不执行
在 scrapy 中, scrapy.Request(url, headers=self.header, callback=self.parse) 调试的时候,发现回调函数 parse_detail ...
- 02MySQL中的数据类型
一.数值 INT DECIMAL 准确的小数值 FLOAT DOUBLE 二.字符串类型 CHAR(m) 此数据类型用于表示固定长度的字符串,可以包含最多达255个字符,其中m代表字符串的长度.长度固 ...
- Difference between ID and control.ClientID OR why use control.ClientID if I can access control through ID
https://stackoverflow.com/questions/3743582/difference-between-id-and-control-clientid-or-why-use-c ...
- kubectl基础支持
kubectl get deployment -n alpha kubectl get deployment *****-deployment -n alpha -o json kubectl rol ...
- AngularJS 笔记1
2017-03-23 本文更新链接: http://www.cnblogs.com/daysme/p/6606805.html 什么是 angularjs 2009年有两个外国人创建,后由谷歌收购并开 ...
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
- P1230 智力大冲浪
题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...
- Centos7安装配置Apache+PHP+Mysql+phpmyadmin
转载自: Centos7安装配置Apache+PHP+Mysql+phpmyadmin 一.安装Apache yum install httpd 安装成功后,Apache操作命令: systemctl ...