【HDU4507】恨7不成妻
Description
单身!
依然单身!
吉哥依然单身!
DS级码农吉哥依然单身!
所以,他生平最恨情人节,不管是214还是77,他都讨厌!
吉哥观察了214和77这两个数,发现:
2+1+4=7
7+7=7*2
77=7*11
最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数!
什么样的数和7有关呢?
如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关——
1、整数中某一位是7;
2、整数的每一位加起来的和是7的整数倍;
3、这个整数是7的整数倍;
现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和。
Input
输入数据的第一行是case数T(1 <= T <= 50),然后接下来的T行表示T个case;每个case在一行内包含两个正整数L, R(1 <= L <= R <= 10^18)。
Output
请计算[L,R]中和7无关的数字的平方和,并将结果对10^9 + 7 求模后输出。
Sample Input
3
1 9
10 11
17 17
Sample Output
236
221
0
算是数位DP里面比较复杂的一道题了。思路其实很简单,我们设置状态时只需要考虑三个维度就可以了:
- 当前的位数
- 所有位上的数的和%7的值。
- 这个数%7的值。
下面的所有状态都是这三个维度。然后我们考虑要将一个数a后面直接接一个数b,拼成一个数a*p+b。然后我们用基础的数学运算发现。所以我们要维护
,
。还要维护
表示满足条件的数的个数就可以了。
具体DP转移的代码如下:
for(int i=1;i<=18;i++) {
for(ll j=0;j<7;j++) {
for(ll k=0;k<7;k++) {
if(!vis[i-1][j][k]) continue ;
for(ll q=0;q<=9;q++) {
if(q==7) continue ;
(f[i][(j+q)%7][(k+q*p7[i-1])%7]+=f[i-1][j][k]+2*q*p[i-1]%mod*g[i-1][j][k]%mod+q*q%mod*p[i-1]%mod*p[i-1]%mod*cnt[i-1][j][k]%mod)%=mod;
(g[i][(j+q)%7][(k+q*p7[i-1])%7]+=g[i-1][j][k]+q*p[i-1]%mod*cnt[i-1][j][k]%mod)%=mod;
(cnt[i][(j+q)%7][(k+q*p7[i-1])%7]+=cnt[i-1][j][k])%=mod;
vis[i][(j+q)%7][(k+q*p7[i-1])%7]=1;
}
}
}
}
具体细节就是按照公式来维护对应的值就可以了。
细节还是不少,开始没有想到还要维护个cnt,然后就半天没调出来。。。
完整代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#define ll long long
#define mod 1000000007ll using namespace std;
inline ll Get() {ll x=,f=;char ch=getchar();while(ch<''||ch>'') {if(ch=='-') f=-;ch=getchar();}while(''<=ch&&ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}return x*f;} int T;
ll l,r;
ll c[];
ll f[][][];
ll g[][][];
ll cnt[][][];
ll p[],p7[];
bool vis[][][];
void pre(ll x) {
c[]=;
for(;x;x/=) c[++c[]]=x%;
}
ll dfs(int v,ll s1,ll s2,ll sum,ll flag) {
if(!v) {
if(s1%&&s2%) return sum*sum%mod;
else return ;
}
ll ans=;
if(!flag) {
for(ll i=;i<;i++) {
for(ll j=;j<;j++) {
if(vis[v][i][j]&&(s1+i)%&&(s2+j)%) {
(ans+=f[v][i][j]+*sum*g[v][i][j]%mod+sum*sum%mod*cnt[v][i][j]%mod)%=mod;
}
}
}
} else {
ll k=c[v];
for(int i=;i<=k;i++) {
if(i==) continue ;
(ans+=dfs(v-,(s1+i)%,(s2+i*p7[v-])%,(sum+p[v-]*i%mod)%mod,flag&&i==c[v]))%=mod;
}
}
return ans;
}
ll work(ll x) {
pre(x);
return dfs(c[],,,,);
}
int main() {
p[]=p7[]=;
for(int i=;i<=;i++) p[i]=p[i-]*%mod;
for(int i=;i<=;i++) p7[i]=p7[i-]*%;
vis[][][]=;
cnt[][][]=;
for(int i=;i<=;i++) {
for(ll j=;j<;j++) {
for(ll k=;k<;k++) {
if(!vis[i-][j][k]) continue ;
for(ll q=;q<=;q++) {
if(q==) continue ;
(f[i][(j+q)%][(k+q*p7[i-])%]+=f[i-][j][k]+*q*p[i-]%mod*g[i-][j][k]%mod+q*q%mod*p[i-]%mod*p[i-]%mod*cnt[i-][j][k]%mod)%=mod;
(g[i][(j+q)%][(k+q*p7[i-])%]+=g[i-][j][k]+q*p[i-]%mod*cnt[i-][j][k]%mod)%=mod;
(cnt[i][(j+q)%][(k+q*p7[i-])%]+=cnt[i-][j][k])%=mod;
vis[i][(j+q)%][(k+q*p7[i-])%]=;
}
}
}
}
T=Get();
while(T--) {
l=Get(),r=Get();
cout<<(work(r)-work(l-)+mod)%mod<<"\n";
} return ;
}
【HDU4507】恨7不成妻的更多相关文章
- [HDU4507]吉哥系列故事——恨7不成妻
[HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...
- 吉哥系列故事——恨7不成妻(数位DP)
吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others) ...
- [HDU] 4507 恨7不成妻
吉哥系列故事——恨7不成妻 Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 【数位DP】恨7不成妻
[数位DP]恨7不成妻 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...
- 吉哥系列故事——恨7不成妻(数位dp)
吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...
- HDU-4507 吉哥系列故事——恨7不成妻 数位DP
题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...
- hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模
http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...
- 2018.09.27 hdu4507吉哥系列故事——恨7不成妻(数位dp)
传送门 一道比较综合的数位dp. 维护三个值:[L,R][L,R][L,R] 区间中与7无关的数的数量,与7无关的数之和,与7无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
随机推荐
- Apache Kafka: 优化部署的10个最佳实践
原文作者:Ben Bromhead 译者:江玮 原文地址:https://www.infoq.com/articles/apache-kafka-best-practices-to-opti ...
- pip解决超时问题(timeout)
我们下载python的库一般会使用pip工具.但在下载的过程中经常会timeout,这是因为资源在国外,我们国内某些资源下载速度特别慢,主要有两种方法解决. 一.设置pip timeout超时时间 创 ...
- hiveServer2 和 metastore的一点解读。
刚看了hive官网的文档,对于一些概念结合自己的经验,似乎又多了一些理解,想一想还是记下来的好,一来我是个有些健忘的人,过一段时间即便忘了,循着这个帖子,也能快速把知识点抓起来:二来或许对别人也有些启 ...
- Hive基础之Hive与关系型数据库的比较
Hive与关系型数据库的比较 使用Hive的CTL(命令行接口)时,你会感觉它很像是在操作关系型数据库,但是实际上,Hive和关系型数据库有很大的不同. 1)Hive和关系型数据库 ...
- /proc文件系统(二):/proc/<pid>/stat
0. 前言 /proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. 它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某 ...
- Uboot 引导内核时加载地址与入口地址问题
如果使用 mkimage 生成内核镜像文件的话,会在内核的前头加上了 64 bytes 的信息头,供建立 tag 之用.bootm 命令会首先判断 bootm xxx 这个指定的地址 xxx 与 -a ...
- Mysql 存储过程实例详解
存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,存储和和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN.OUT.INOUT类型,而函数的参数只能是IN类 ...
- 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题
多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...
- react组件中的constructor和super小知识
react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...
- 在线客服兼容谷歌Chrome、苹果Safari、Opera浏览器的修改
纵览全网提供的众多号称兼容多浏览器的自动收缩在线客服,其实只兼容了IE和FF两种,当遇到谷歌Chrome.苹果Safari.Opera浏览器时鼠标还没点到客服按钮就会自动缩回,实用效果完全打折 以下代 ...