【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无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
随机推荐
- [Luogu 3613] 睡觉困难综合征
Description 给定一棵 \(n\) 个点的树,每个点上有位运算 \(opt\) 和一个权值 \(x\),位运算有 &,|,^ 三种. 要求支持: 修改点 \(v\) 的 \(opt\ ...
- ajax与文件上传
一.ajax ajax(Asynchronous JavaScript And XML):异步JavaScript和XML,即使用JavaScript语句与服务器进行异步交互,传输的数据为XML(也可 ...
- C# ValueTuple 原理
本文告诉大家一些 ValueTuple 的原理,避免在使用出现和期望不相同的值.ValueTuple 是 C# 7 的语法糖,如果使用的 .net Framework 是 4.7 以前,那么需要使用 ...
- Adding a struct into an array(stackoverflow)
Question: So lets say I have a struct like this: struct example_structure { int thing_one; int thing ...
- JS调用模式
在js中,一共4中调用方式.需要注意的是,调用方式中,this的指向问题. 函数调用模式 this丢失,debug会提示未定义相应属性.按照规范,需要将this赋值给that let myObj = ...
- Spring全家桶系列–SpringBoot之AOP详解
//本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...
- html的标签分类————body内标签系列
超链接标签 <a href="" target="_blank">text</a>,此类标签通常是超链接.其中href后面跟进的是超链接 ...
- 【代码笔记】Web-HTML-标题
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【读书笔记】iOS-访问iPod媒体库
iOS设备内部都有一个iPod媒体库,在这个媒体库中包含了音频和视频文件,它的来源主要是苹果公司的iTunes Store,现在苹果公司的iTunes Store内容很多,但能够下载到iPod媒体库的 ...
- 组件化和 React
一,对组件化的理解 1,组件的封装 -视图 -数据 -变化逻辑(数据驱动视图变化) 例: import React, { Component } from 'react'; import List f ...