题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507
题意:求[L,R](1 <= L <= R <= 10^18)区间内和7无关的数字的平方和。
如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关——
  1、整数中某一位是7;
  2、整数的每一位加起来的和是7的整数倍;
  3、这个整数是7的整数倍;
想法:如果不是求平方和,而是求个数的话,很容易写。重点就是如何求平方和:开一个三维dp[i][j][k]结构体,i表示第i位,j表示到从最高位到第i位的每一位的累加和模7,k表示最高位到第i位的数值模7,结构体由和7有关的数的个数(cnt),和7有关的数的和(sum),和7有关的数的平方和(squ_sum)组成。cnt很容易求,若求出cnt的话,在这个过程中加上i*a[pos]*cnt,sum也求出来了。对于求平方和因为(a+b)^2=a^2+b^2+2*a*b,所以squ_sum=squ_sum(后面的)+(i*b[pos]*cnt)^2+2*sum*i*b[pos]*cnt;(b[pos]相当于10^pos)
代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define bug() puts("wtf???")
#define inf 0x3f3f3f3f
#define scanfprint() freopen("1input.txt","r",stdin)
#define printfprint() freopen("output.txt","w",stdout)
#define mem(a,b) memset(a,b,sizeof(a))
const int spot=1000+10;
const int edge=100000+10;
const int maxn=100000+10;
const double pi=acos(-1.0);
const ll l_mod=1e9+7;
const double ips=0.000001;
struct stu
{ll cnt,sum,squ_sum;
} dp[25][10][10];
ll a[25],b[25];
void init()
{int i;b[1]=1;for(i=2; i<=19; i++)b[i]=b[i-1]*10%l_mod;memset(dp,-1,sizeof(dp));
}
stu dfs(int pos,int sum,int mod,int last)
{if(!pos){stu temp={0};temp.cnt=sum&&mod;temp.sum=temp.squ_sum=0;return temp;}if(!last&&dp[pos][sum][mod].cnt!=-1)return dp[pos][sum][mod];stu temp={0},ans={0};int num=last?a[pos]:9,i;for(i=0; i<=num; i++){if(i==7) continue;temp=dfs(pos-1,(sum+i)%7,(mod*10+i)%7,i==num&&last);ans.cnt=ans.cnt+temp.cnt;ans.cnt%=l_mod;ans.sum+=(temp.cnt*i%l_mod*b[pos]%l_mod+temp.sum)%l_mod;ans.sum%=l_mod;ans.squ_sum+=(temp.squ_sum + 2*b[pos]*i%l_mod*temp.sum)%l_mod;ans.squ_sum%=l_mod;ans.squ_sum+=( temp.cnt*b[pos]%l_mod*b[pos]%l_mod*i*i%l_mod);ans.squ_sum%=l_mod;}if(!last)dp[pos][sum][mod]=ans;return ans;
}
ll cal(ll n)
{int sizes=0;while(n)a[++sizes]=n%10,n/=10;stu ans=dfs(sizes,0,0,1);return ans.squ_sum;
}
int main()
{int nn;init();scanf("%d",&nn);while(nn--){ll l,r;cin>>l>>r;ll ans=cal(r)-cal(l-1);ans=(ans%l_mod+l_mod)%l_mod;cout<<ans<<endl;}return 0;
}

HDU4507 吉哥系列故事――恨7不成妻 数位DP相关推荐

  1. HDU-4507 吉哥系列故事――恨7不成妻 (数位dp)

    J - 吉哥系列故事――恨7不成妻 HDU - 4507 题解:数位dp 和简单的数位dp不同,这道题要算所有合法数的平方和 考虑到一个数可以写成X=ΣAi*Pi,(其中Ai为X每一位的值,Pi=10 ...

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

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

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

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

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

    题目链接:点击查看 题目大意:给出闭区间[l,r],求出区间内与7不沾边的数的平方和 与7有关的条件: 整数中某一位是7: 整数的每一位加起来的和是7的整数倍: 这个整数是7的整数倍: 题目分析:抛去 ...

  5. HDU4507吉哥系列故事――恨7不成妻

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

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

    吉哥系列故事--恨7不成妻 ∑i=1n(pre+suc)2∑i=1npre2+suc2+2×pre×sucn×pre2+∑suc2+2×pre∑suc\sum_{i = 1} ^{n}(pre + s ...

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

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

  8. HDU - 4507 吉哥系列故事――恨7不成妻 (数位DP)

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

  9. HDU 4507 吉哥系列故事――恨7不成妻 (平方拆解 + *数位DP 总结)

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

最新文章

  1. 《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程 | 附源码...
  2. LeetCode题解之Largest Number
  3. Java线程之核心概念
  4. 安卓学习 之 网络技术(十)
  5. php详解递归,PHP递归算法详解
  6. [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]
  7. 嵌入式工程师薪资调查
  8. LeetCode 1563. 石子游戏 V(DP)
  9. 论网络安全(观直播后感)
  10. 慢雾安全工程师:安全审计是目前保护 DeFi 项目安全最高性价比的方式
  11. 百度语音合成 js html,百度文字转语音免费接口使用实例
  12. EasyUI 异步Tree
  13. EventBus BackgroundPoster原理解析
  14. 通达oa 2013 php解密,通达OA 2011-2013 通杀GETSHELL修复补丁
  15. 机械臂模糊PID控制matlab仿真
  16. Adams 线性多步积分器(一)
  17. 这是一份文科生都能看懂的线性代数简介
  18. 新手建站推广完美教程(重点推荐)
  19. 软件测试与代码安全详解
  20. 2021软科中国计算机专业排名

热门文章

  1. c语言二维数组怎么找鞍点,怎么求一个二维数组的鞍点
  2. 白名单网站有哪些?盘点国家级门户网站认可的白名单来源媒体
  3. 【DBeaver】介绍DBeaver这一款强大的数据库连接工具
  4. 康佳液晶电视(非智能)Mstar V56 芯片
  5. Git、Gerrit、Repo三者的区别及使用
  6. Python读取excel表格数据并绘制成柱状图 | 数据排序、柱状图颜色、标签乱码等问题通通能够解决!
  7. Print Spooler服务对打印的影响
  8. 明日方舟统计寻访工具【附下载链接】
  9. [zt] Big-Endian VS Little-Endian —— 从大头开始还是小头开始
  10. Oracle内置SQL函数-分类整理大全