题目链接:https://vjudge.net/problem/HDU-4507

题意:定义如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关——
  1、整数中某一位是7;

  2、整数的每一位加起来的和是7的整数倍;

  3、这个整数是7的整数倍;

  给定l,r,求[l,r] 区间与7无关的数的平方和。

思路:这3条定义都是常规的数位dp,但题目求的并不是与7无关的数的个数,而是平方和,这也是该题的难点。这里需要数位dp维护3个值:

  1. 与7无关的数的个数num;

  2. 与7无关的数的和sum;

  3. 与7无关的数的平方和sum;

  (用结构体组织上述3个属性,假设当前求的结点是ans,当前点取i,递归得到的结点为tmp)

  第1条很简单,就是常规的数位dp:

    ans.num+=tmp.num;
    ans.num%=Mod;

  第2条需要用到第一条,求当前的所有数的和,即后面位的所有和+当前值×后面的数的个数:

    ans.sum+=(tmp.sum+(i*key[pos])%Mod*tmp.num%Mod)%Mod;
    ans.sum%=Mod;

  第3条需要用到前2条,求当前所有数的平方和。先考虑一个数,设该数后面的位数的值为b,当前要加的值为a(a=i*key[pos]),则该数平方和为(a+b)^2=a^2+2*a*b+b^2,然后考虑对所有数的平方和,即上述式子求和tmp.num次,上述式子有3项。第一项:即a^2*tmp.num。第二项:即2*a*tmp.sum。第三项:即tmp.sqsum。

        ans.sqsum+=tmp.num*i%Mod*i%Mod*key[pos]%Mod*key[pos]%Mod;
ans.sqsum%=Mod;
ans.sqsum+=*i*key[pos]%Mod*tmp.sum%Mod;
ans.sqsum%=Mod;
ans.sqsum+=tmp.sqsum;
ans.sqsum%=Mod;

还有要注意的是这道题的数据,因为num,sum,sqsum还有key[i]都可能超过Mod,所以每乘一次就要%Mod,不然会出现乘法溢出。

AC代码:

#include <cstdio>
using namespace std;
typedef long long LL;
const LL Mod=; struct node{
LL num,sum,sqsum;
}dp[][][]; int T,a[];
LL key[]; node dfs(int pos,int pre1,int pre2,bool limit){
if(pos==-){
node tmp;
tmp.num=(pre1!=&&pre2!=);
tmp.sum=tmp.sqsum=;
return tmp;
}
if(!limit&&dp[pos][pre1][pre2].num!=-)
return dp[pos][pre1][pre2];
int up=limit?a[pos]:;
node ans;
ans.num=ans.sum=ans.sqsum=;
for(int i=;i<=up;++i){
if(i==) continue;
node tmp=dfs(pos-,(pre1+i)%,(pre2*+i)%,limit&&i==a[pos]); ans.num+=tmp.num;
ans.num%=Mod; ans.sum+=(tmp.sum+(i*key[pos])%Mod*tmp.num%Mod)%Mod;
ans.sum%=Mod; ans.sqsum+=tmp.num*i%Mod*i%Mod*key[pos]%Mod*key[pos]%Mod;
ans.sqsum%=Mod;
ans.sqsum+=*i*key[pos]%Mod*tmp.sum%Mod;
ans.sqsum%=Mod;
ans.sqsum+=tmp.sqsum;
ans.sqsum%=Mod;
}
if(!limit) dp[pos][pre1][pre2]=ans;
return ans;
} LL solve(LL x){
int pos=;
while(x){
a[pos++]=x%;
x/=;
}
return dfs(pos-,,,true).sqsum;
} int main()
{
key[]=;
for(int i=;i<=;++i)
key[i]=(key[i-]*)%Mod;
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k)
dp[i][j][k].num=-;
scanf("%d",&T);
while(T--){
LL l,r,ans;
scanf("%lld%lld",&l,&r);
ans=solve(r)-solve(l-);
ans=(ans%Mod+Mod)%Mod;
printf("%lld\n",ans);
}
return ;
}

hdoj4507(数位dp)的更多相关文章

  1. 专题训练之数位DP

    推荐以下一篇博客:https://blog.csdn.net/wust_zzwh/article/details/52100392 1.(HDOJ2089)http://acm.hdu.edu.cn/ ...

  2. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  3. bzoj1026数位dp

    基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...

  4. uva12063数位dp

    辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...

  5. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. 数位DP GYM 100827 E Hill Number

    题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...

  7. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

  8. 数位DP入门

    HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...

  9. 数位DP之奥义

    恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...

随机推荐

  1. 2019春Python程序设计练习7(0430--0506)

    1-1 对文件进行读写操作之后必须显式关闭文件以确保所有内容都得到保存. (2分) T         F 1-2 以追加模式打开文件时,文件指针指向文件尾.(2分) T         F 1-3 ...

  2. django第一个页面

    在工程创建完毕的基础上,创建两个目录,static;templates static 里面放一些静态文件,例如css,imj,js等文件 templates 放html文件,需要在settings.p ...

  3. Confluence 6 预览一个文件

    当你浏览一个页面的时候,单击一个图片,文件缩略图或者链接将会运行预览. 预览视图包括了从远程 Web 页面导入的图片文件和已经附加到页面中的文件(尽管有可能这些文件没有在页面中显示). 在预览中你可以 ...

  4. 手动升级 Confluence - 规划你的升级

    1. 确定你的升级路径 使用下面的表格来确定最佳的升级路径来让你的Confluence 从当前版本升级到最新的 Confluence 版本. 你的版本 推荐升级到 Confluence 的升级路径 2 ...

  5. 51 nod 1127最短的包含字符串(尺取法)

    1127 最短的包含字符串   收藏  关注 给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度.如果给出的字符串中并不包括A-Z中的全 ...

  6. 前端js图片上传

    前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...

  7. Django JWT

    概述 如果各位不了解 JWT,不要紧张,它并不可怕. JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个 ...

  8. XStream详解

    XStream的作用 XStream可以把JavaBean对象转换成XML! 通常服务器向客户端响应的数据都是来自数据库的一组对象,而我们不能直接把对象响应给客户端,所以我们需要把对象转换成XML再响 ...

  9. centos文件实时同步inotify+rsync

    我的应用场景是重要文件备份 端口:873,备份端打开即可 下载地址:https://rsync.samba.org/ftp/rsync/src/ 服务端和客户端要保持版本一致 网盘链接:https:/ ...

  10. web长时间不激活 终止用户回话

    参考资料: http://web.jobbole.com/89072/ http://www.cnblogs.com/1175429393wljblog/p/5570606.html http://w ...