传送门

三个限制都可以数位 $dp$ , $dfs$ 是维护当前位,之前各位总和模 $7$ 意义下的值,之前填的数模 $7$ 意义下的值,是否贴着限制

主要现在求的是各个合法数的平方的和,比较恶心

开一个结构体维护一下三个东西,合法数的个数,合法数的和,合法数的平方和

前两个好维护,平方和发现其实可以拆开,比如下一层 $dfs$ 传上来的和为 $x$ ,当前位填的数为 $k$ ,考虑当前所有合法数的平方和看成每一个合法数的平方的和

设下一层某一个合法数传上来的值为 $y$,那么当前层的值即为

$10^p \cdot k + y$ ,平方后即为 $10^{2p} \cdot k^2 + y^2 + 2ky \cdot 10^p$

发现所有的 $y^2$ 加起来以后其实就是下一层的合法数的平方和

对于 $2ky \cdot 10^p$ ,把 $2k \cdot 10^p$ 提出来,那么也可以把所有 $y$ 加起来即为下一层的合法数的和

对于 $10^{2p} \cdot k^2$ ,因为加了下一层合法数的个数次,那么贡献即为下一层合法数数量乘 $10^{2p} \cdot k^2$

所以我们完全可以用下一层的数据维护出当前位的数据

具体实现可以看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline ll read()
{
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;
}
const int mo=1e9+;
inline int fk(int x) { return x>=mo ? x-mo : x; }
ll T,L,R;
struct dat {
ll tot,sum,sum2;
dat (ll _tot=,ll _sum=,ll _sum2=) { tot=_tot,sum=_sum,sum2=_sum2; }
inline dat operator + (const dat &tmp) const {
return dat(fk(tot+tmp.tot),fk(sum+tmp.sum),fk(sum2+tmp.sum2));
}
inline dat operator * (const ll &tmp) const {
return dat(tot, fk(tot*tmp%mo + sum) , fk( fk((tot*tmp%mo)*tmp%mo + (2ll*tmp%mo)*sum%mo) + sum2 ) );
}
}f[][][][];
ll Power[];
vector <int> V;
dat dfs(int p,int sum,int now,bool lim)
{
if(!p) return (sum&&now) ? dat(,,) : dat(,,);
dat &t=f[p][sum][now][lim];
if(t.tot!=-) return t;
t.tot=;
for(int k=;k<=;k++)
{
if(lim&&k>V[p-]) break;
if(k==) continue;
dat add=dfs(p-,(sum+k)%,(now*+k)%,lim&(k==V[p-]));
t=t + ( add * (Power[p-]*k%mo) );
}
// cout<<p<<" "<<sum<<" "<<now<<" "<<lim<<" "<<t.tot<<" "<<t.sum<<" "<<t.sum2<<endl;
return t;
}
inline void Clr()
{
for(int i=;i<=;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
f[i][j][k][]=f[i][j][k][]=dat(-,,);
}
int main()
{
T=read();
Power[]=; for(int i=;i<=;i++) Power[i]=Power[i-]*%mo;
while(T--)
{
L=read()-,R=read();
ll now=R; V.clear(); Clr();
while(now) V.push_back(now%),now/=;
ll ans=dfs(V.size(),,,).sum2;
now=L; V.clear(); Clr();
while(now) V.push_back(now%),now/=;
printf("%d\n",fk(ans-dfs(V.size(),,,).sum2+mo));
}
return ;
}

HUD 4507 吉哥系列故事——恨7不成妻的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507

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

  9. 吉哥系列故事――恨7不成妻 HDU - 4507

    题目: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

随机推荐

  1. [CSP-S2019]:赛后总结

    笔者有幸参加了$CSP-S\ 2019$,$AFO$之前,写下自己最后一篇赛后总结. $Day\ 0$ 早上起来把自己调了一晚上被卡空间的题卡过了,很开心(内存限制$256MB$,然而我的内存申请是$ ...

  2. redis服务及其配置与应用(window 环境下)

    一.redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API(源自百度百科),个人更喜欢下面的解释:我们 ...

  3. Flutter移动电商实战 --(1)项目学习记录

    1.项目相关截图 2.项目知识点梳理图 Dio2.0: Dio是一个强大的 Dart Http 请求库,支持 Restful API.FormData.拦截器.请求取消等操作. Swiper: Swi ...

  4. 火车购票问题(16年ccf)

    火车购票问题(16年ccf) 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一 ...

  5. 2.3 Go语言基础之数组

    本文主要介绍Go语言中数组(array)及它的基本使用. 一.Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基 ...

  6. [转]Nginx配置信息详解

    序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...

  7. Selenium 2自动化测试实战38(整合自动发邮件功能)

    整合自动发邮件功能 解决了前面的问题后,现在就可以将自动发邮件功能集成到自动化测试项目中了.下面重新编辑runtest.py文件 #runtest.py #coding:utf-8 from HTML ...

  8. jsp细节------<base>

    1:jsp一般都有这个<base href="<%=basePath%>">,它的作用一般用不到,但在使用java框架用注解时会用. 如下代码(xxx.js ...

  9. python系列之 - (select、poll、epoll)

    select函数操作集合的时候有个要求,要么集合本身是描述符,要么他提供一个fileno()接口,返回一个描述符. I/O多路复用是在单线程模式下实现多线程的效果,实现一个多I/O并发的效果.看一个简 ...

  10. Android View重绘和更新: invalidate和requestLayout 总结的不错 赶紧复制。。哈哈

    总述:View有两个很重要的方法:invalidate和requestLayout,常用于View重绘和更新. Invalidate:To farce a view to draw,call inva ...