【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无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
随机推荐
- PHP的UTF-8中文转拼音处理类
<?php /** * PHP 汉字转拼音 * @author Jerryli(hzjerry@gmail.com) * @version V0.20140715 * @package SPFW ...
- U3D Time类
Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算. Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止. Tim ...
- 关于setTimeout的的JS知识
https://www.jianshu.com/p/3e482748369d?from=groupmessage
- laravel C层接收数据的步骤
use Illuminate\Http\Request; function fun(Request $request){ //获取修改的数据 $arr = $request->all(); // ...
- Ajax事件,方法
1\ready:事件:使用ready()来使函数在文档加载后可用 $(document).ready(funcation(){ 函数体 }) 2\click事件:当单机元素时,使用 3\focus事件 ...
- Anaconda 安装、使用
一.下载: 清华镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 二.安装: 默认就行,安装路径最好换一下 三.配置环境变量: 控制面 ...
- H指数
H指数是用来综合衡量学者发表论文的数量和质量的指标,若某学者共发表N篇论文,H指数是指存在h 篇论文至少每篇有h 引用量,剩下的N-h篇中,每篇都不超过h引用量 计算H指数的方法:1.排序法思路:先将 ...
- CSS学习笔记07 盒子模型
1.盒子模型 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器.每个矩形都由元素的内容.内边距(padding).边框(border)和外边距(margin)组成. ...
- IDEA——错误: 找不到或无法加载主类 com.Main
https://blog.csdn.net/gxx_csdn/article/details/79059884 这篇博客非常赞!
- 递归函数获得n个不重复的随机数
// 递归函数获取不重复的随机数 var arr_end; // 用于保存最后得到的数组 function suiji(n) { var arr = [] // 产生n个随机数加入数组 for(var ...