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$,数字取余 ...
随机推荐
- Linux使用——Linux命令——CentOS7防火墙使用
注意:设置防火墙需要使用具有root权限的用户进入: CentOS 7.0默认使用的是firewall作为防火墙: CentOS 7.0使用systemctl来管理服务和程序,包括了service和c ...
- Android灯光系统--通知灯深入分析【转】
本文转自:https://www.cnblogs.com/lkq1220/p/6406261.html Android灯光系统--通知灯深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 ...
- linux内核中的dquot是什么?
答:这个与磁盘配额管理(disk quota)有关,内核配置选项为CONFIG_QUOTA,使能此选项意味着可以设置每个用户的硬盘使用限制.
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
- cannot open window service on computer '.' in window application
1.配置错误,需要检查对应的windows service的exe文件所在文件夹下的log 2.在命令行通过Start-Service启动,需要有管理员权限.
- c# 之系统环境安装
在重装系统后,对一些原有软件进行了卸载,不知道是什么原因总是提示vs2015 需安装IE10,但是又碰到ie10的一些插件不适合此系统.网上介绍的vs修复没有任何作用 最后找到方法是:重装系统,然后不 ...
- P4363 [九省联考2018]一双木棋chess
思路 容易发现只能在轮廓线的拐点处落子,所以棋盘的状态可以用一个n+m长度的二进制数表示 转移就是10变成01 代码 #include <cstdio> #include <algo ...
- Git-Flow | How it’s used and why you should
Git-Flow | How it’s used and why you should What is Git-Flow about? Git-Flow is a workflow for using ...
- RabbitMQ学习之延时队列
原帖参考:http://www.cnblogs.com/telwanggs/p/7124687.html?utm_source=itdadao&utm_medium=referral http ...
- linux_nmon监控方法
一.介绍 Nmon 工具是 IBM 提供的免费的在AIX与各种Linux操作系统上广泛使用的监控与分析工具.该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工 ...