HDU 4507
数位DP。
一般是利用DFS来求数位DP了,结合了记忆化搜索。设dp[i][j][k]为前i位,并且前i位的数位和mod7为j,前i位的数字的表示数字值mod7。为什么可以这样呢?因为继续DFS下去,必定是得到一个不是7倍数的数的,因而,k这个位只是在确定叶子结点时有用的。
然后,可以这样选,求一个一些数的平方和(A+B)^2=A^2+2AB+B^2,由于B是可以是多个,因为会乘上一个cnt个数。
至于dp,记录的是当前状态下,其后续(因为是DFS)能得到的符合要求的个数,它们的和,以及它们的平方和。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
using namespace std;
const LL MOD=1000000007;
struct Node{
LL cnt,msum,sqsum;
void init(){
cnt=-1,msum=0,sqsum=0;
};
}dp[35][7][7];
LL l,r;
int num[35],len;
LL mod[35]; Node dfs(int len,int prem,int presqm,bool flag){
if(len==0){
Node st;
st.init();
if(prem&&presqm){
st.cnt=1;
}
else st.cnt=0;
return st;
}
if(!flag&&dp[len][prem][presqm].cnt!=-1) return dp[len][prem][presqm];
int up=flag?num[len]:9;
Node ans;
ans.init(); ans.cnt=0;
for(int i=0;i<=up;i++){
if(i==7) continue;
Node st=dfs(len-1,(prem+i)%7,(presqm*10+i)%7,(flag&&i==up)?true:false);
ans.cnt+=st.cnt;
ans.cnt%=MOD;
ans.msum=(ans.msum+st.msum+(st.cnt%MOD*(mod[len]*i)%MOD)%MOD)%MOD;
ans.sqsum=(ans.sqsum+st.sqsum+((2*mod[len])%MOD*(i*st.msum)%MOD)%MOD)%MOD;
ans.sqsum=(ans.sqsum+((mod[len]*i)%MOD*(i*mod[len])%MOD)%MOD*st.cnt)%MOD;
}
if(!flag) dp[len][prem][presqm]=ans;
return ans;
} LL slove(LL n){
len=0;
while(n){
num[++len]=(int)(n%10);
n/=10;
}
Node tmp=dfs(len,0,0,true);
return tmp.sqsum;
} int main(){
int T;
mod[1]=1;
for(int i=2;i<35;i++){
mod[i]=(mod[i-1]*10)%MOD;
}
scanf("%d",&T);
while(T--){
for(int i=0;i<35;i++){
for(int k=0;k<7;k++){
for(int l=0;l<7;l++)
dp[i][k][l].init();
}
}
scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",((slove(r)-slove(l-1))%MOD+MOD)%MOD);
}
return 0;
}
HDU 4507的更多相关文章
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- HDU 4507 (鬼畜级别的数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:求指定范围内与7不沾边的所有数的平方和.结果要mod 10^9+7(鬼畜の元凶) 解题 ...
- HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...
- HDU 4507 吉哥系列故事——恨7不成妻
需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...
- HDU 4507 有点复杂却不难的数位DP
首先来说,,这题我wrong了好几次,代码力太弱啊..很多细节没考虑.. 题意:给定两个数 L R,1 <= L <= R <= 10^18 :求L 到 R 间 与 7 无关的数的平 ...
- 吉哥系列故事――恨7不成妻 HDU - 4507 数位dp
思路 和普通的DP不一样的是 这里求的是满足条件的数的平方的和 而数位DP只跟数每位是什么密切相关 所以要开一个结构 (多加一个 数的和sum 和平方和qsum)存一下各个状态的和的情况 dp[p ...
- HDU 4507 求指定范围内与7不沾边的所有数的平方和 (数位DP)
题意:求区间[l,r]内所有与7无关的数的平方和(取模)定义与7无关的数: 1.数字的数位上不能有7 ...
- HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)
题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区 ...
- [HDU] 4507 恨7不成妻
吉哥系列故事——恨7不成妻 Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
随机推荐
- APP-Android:APK
ylbtech-APP-Android:APK APK是AndroidPackage的缩写,即Android安装包(apk).APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直 ...
- AMQP server localhost:5672 closed the connection. Check login credentials: Socket closed
2016-04-13 09:23:38.755 18850 INFO oslo.messaging._drivers.impl_rabbit [req-fafc8542-9403-4b5a-89d2- ...
- js实用篇之数组、字符串常用方法
常常在开发中,会使用到很多js数组和字符串的处理方法,这里列举一些我常用到的一些,方便大家参考使用. 数组方面 push:向数组尾部增加内容,返回的是新数组的长度. var arr = [1,2,3] ...
- RPC与REST
RPC与REST (摘自网络,个人理解)
- Python之function
1 Function a function is a device that groups a set of statements so they can be run more than once ...
- 压缩映射:简单最邻近搜索-(SLH)Simple Linear Hash
Compact Projection: Simple and Efficient Near Neighbor Search with Practical memory Requirement Auto ...
- THREE.js代码备份——webgl - materials - cube refraction [balls](以上下左右前后6张图片构成立体场景、透明球体效果)
<!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - ma ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
http://www.cnblogs.com/wuhuacong/p/3873498.html 数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在 ...
- Robot Framework(八) 资源和变量文件
2.7资源和变量文件 测试用例文件和测试套件初始化文件中的用户关键字和变量只能在创建它们的文件中使用,但资源文件提供了共享它们的机制.由于资源文件结构非常接近测试用例文件,因此很容易创建它们. 变量文 ...
- RecyclerView 悬浮/粘性头部效果3种方式
但是以上两种方式onDrawOver()方法实现逻辑对初次查看该段代码要花时间理解.下面代码逻辑(原理一样,同样参考大神代码)相对清晰,易理解 public class StickyDecoratio ...