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里面比较复杂的一道题了。思路其实很简单,我们设置状态时只需要考虑三个维度就可以了:

  1. 当前的位数
  2. 所有位上的数的和%7的值。
  3. 这个数%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不成妻的更多相关文章

  1. [HDU4507]吉哥系列故事——恨7不成妻

    [HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...

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

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

  3. [HDU] 4507 恨7不成妻

    吉哥系列故事——恨7不成妻 Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  4. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...

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

    吉哥系列故事--恨7不成妻 传送门 Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥 ...

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

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

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

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

  8. hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...

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

    传送门 一道比较综合的数位dp. 维护三个值:[L,R][L,R][L,R] 区间中与7无关的数的数量,与7无关的数之和,与7无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...

随机推荐

  1. 用Redis作Mysql数据库缓存

    使用redis作mysql数据库缓存时,需要考虑两个问题: 1.确定用何种数据结构存储来自Mysql的数据; 2.在确定数据结构之后,用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是按 ...

  2. MySQL储存过程

    储存过程 本文章原创,转载需注明出处. 前提: 在大型数据库中 来源: 为了完成特定功能的SQL语句集 定义: 储存在数据库中, 用户通过指定储存过程的名字并给出参数(带有参数的)来执行它 声明: 储 ...

  3. 细说Redis(二)之 Redis的持久化

    前言 在上一篇文章[细说Redis(一)之 Redis的数据结构与应用场景]中,主要介绍了Reids的数据结构. 对于redis的执行命令,这里不做介绍,因为网上搜索一堆,无必要再做介绍. AOF&a ...

  4. [转]Angular2: Cannot read property 'name' of undefined

    本文转自:https://stackoverflow.com/questions/39755336/angular2-cannot-read-property-name-of-undefined 处理 ...

  5. Extjs 项目中常用的小技巧,也许你用得着(1)

    我在项目中遇到的一些知识点: 1.在GridPanel中显示图片,效果 对应的代码实现 { text: '是否启用', width: 80, // xtype: 'checkcolumn', data ...

  6. .net网站上传图片换电脑不显示

    当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可.

  7. 【Spring】8、Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  8. 最新版本elasticsearch本地搭建入门篇

    最新版本elasticsearch本地搭建入门篇 项目介绍 最近工作用到elasticsearch,主要是用于网站搜索,和应用搜索. 工欲善其事,必先利其器. 自己开始关注elasticsearch, ...

  9. 使用脚手架快速搭建React项目

    create-react-app是Facebook官方推出的脚手架,基本可以零配置搭建基于webpack的React开发环境步骤: 打开控制台 进入你想要创建项目的目录文件下面 依次执行以下命令 np ...

  10. rem与px之间的换算(移动端)

    最近因为工作接触到rem与px之间的换算,之前知道一些,不过还是比较笼统模糊,用起来不是很明白,后来自己查了点资料,以及亲自测试总算明白它们之间是怎么换算的了. rem是一个相对值,它相对于根元素ht ...