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 状态转移分析/极限取模的更多相关文章

  1. 吉哥系列故事——恨7不成妻(数位DP)

    吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others)   ...

  2. HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)

    链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...

  3. hdu4507吉哥系列故事——恨7不成妻 (数位dp)

    Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...

  4. HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...

  5. HDU 4507 吉哥系列故事——恨7不成妻

    需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...

  6. HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)

    题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区 ...

  7. HDU-4507 吉哥系列故事——恨7不成妻 数位DP

    题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...

  8. 【hdu4507】吉哥系列故事——恨7不成妻 数位dp

    题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...

  9. hdu4507 吉哥系列故事——恨7不成妻[数位DP]

    这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...

随机推荐

  1. 运行django新的项目,页面总是显示以前的项目,问题解决

    运行django新的项目,页面总是显示以前的项目 只需打开任务管理器,再进程中关闭python.exe 再次重新启动服务,python manage.py runserver.即可

  2. css的再深入4(更新中···)

    两种居中的方式: Margin:0 auto;和text-align:center; Margin的居中是对自身,text-align对元素内部的文本来说. 隐藏的两种方式: visibility:h ...

  3. SpringCloud与Consul集成实现负载均衡

    一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构如下: 二.Co ...

  4. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

  5. Java 11 究竟比 8 快了多少?看看这个基准测试

    开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版本是 8,所以测试者用 Java 8 与 Java 11 进行对比测试 ...

  6. facebook api之Access and Authentication

    Access and Authentication There are three access levels to the Marketing APIs. You can upgrade acces ...

  7. EPPlus实战篇——Excel写入

    .net core 项目 可以向excel写入任何类型(T)的数据,只要T中的field的[Display(Name = "1233", Description = "# ...

  8. Linux 命令之sed

    简介 sed 是一种在线编辑器,它一次处理一行内容.在处理的时候,会先把当前处理的行存储在临时缓冲区,这被称之为 "末世空间", 然后再使用 sed 命令处理缓冲区的内容,处理完成 ...

  9. 【Django】【二】模板

    1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...

  10. unity shader base pass and additional pass

      [Unity Shaders]Shader中的光照,shadersshader 写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已 ...