hdu4507(数位DP)
题目意思: 给定一个区间,求这段区间中,不含7,对7取余为0,各个位数相加之和对7取余为0的数的平方和。
设d[i][j][k][m]代表长度为i的,对7取余为j的,各个位数相加之和对7取余为k的数的平方和,
但是算平方和需要用到这些数的和,这些数的个数。所以用了一个结构体数组保存每种状态的Count,sum1,.sum2;
(ago+k1)^2+(ago+k2)^2+(ago+k3)^2=3*ago^2+2*ago*(k1+k2+k3)+k2^2+k2^2+k3^2;
=Count1*ago^2+2*ago*sum1+sum2;
需要注意取模运算和long long
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define LL long long
- #define MOD 1000000007
- #define maxn 20
- using namespace std;
- const int N=;
- LL md[N];
- LL digit[maxn];
- LL ans=;
- struct node
- {
- LL Count=,sum1=,sum2=;
- };
- node dp[maxn][][][];
- int visit[maxn][][][];
- node dfs(int len,int pre,int before, int state,bool fp) //dfs版本的纯属暴力枚举每一个数字,而递推版本的是考虑了前缀的影响
- {
- if(state)
- {
- node temp;
- temp.Count=;
- temp.sum1=;
- temp.sum2=;
- return temp;
- }
- if(len== && (pre== || before==))
- {
- node temp;
- temp.Count=;
- temp.sum1=;
- temp.sum2=;
- return temp;
- }
- else if(len==)
- {
- node temp;
- temp.Count=;
- temp.sum1=;
- temp.sum2=;
- return temp;
- }
- if(!fp && visit[len][pre][before][state]== ) //
- {
- return dp[len][pre][before][state];
- }
- node ret ;
- int fpmax = fp ? digit[len] : ;
- for(int i=;i<=fpmax;i++) //分别算出以i开头的数的方案数,
- {
- node next=dfs(len-,(((pre*+i))%) ,(before+i)%,i== | state,fp && i == fpmax);
- //temp=temp%MOD;
- //ret+=(temp*temp)%MOD;
- LL ago = ( i*md[len-] )%MOD;
- ret.Count = (ret.Count + next.Count) %MOD;
- ret.sum1 = (ret.sum1 + ( ago*next.Count ) %MOD + next.sum1) %MOD;
- ret.sum2 = ( ret.sum2 + (next.Count* ( (ago*ago )%MOD ) ) %MOD +(*ago*next.sum1)%MOD + next.sum2 ) %MOD;
- }
- if(!fp)
- {
- dp[len][pre][before][state]= ret;
- visit[len][pre][before][state]=;
- }
- return ret;
- }
- LL f(LL n)
- {
- int len=;
- while(n)
- {
- digit[++len] = n % ;
- n /= ;
- }
- LL ans=;
- ans+=dfs(len,,,,true).sum2;
- return ans;
- }
- void init()
- {
- memset(visit,,sizeof(visit));
- }
- int main()
- {
- // freopen("test.txt","r",stdin);
- int t;
- scanf("%d",&t);
- md[]=;
- for(int i=;i<=N;i++)
- md[i]=(md[i-]*)%MOD;
- while(t--)
- {
- init();
- LL n,m;
- scanf("%I64d%I64d",&n,&m);
- LL ans1=f(m);
- LL ans2=f(n-);
- printf("%I64d\n", (ans1-ans2 + MOD)%MOD );
- }
- return ;
- }
hdu4507(数位DP)的更多相关文章
- hdu4507 数位dp+推公式
推公式的能力需要锻炼.. /* dp的时候要存结构体 里面三个元素: cnt,就是满足条件的个数 sum1,就是满足条件的数字和 sum2,满足条件的数字平方和 推导过程:还是用记忆化搜索模板 dp[ ...
- 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无关的数的的平方和. 然后可以用第一个值推第二个,第一个和第二个值推第三个 ...
- 【hdu4507】吉哥系列故事——恨7不成妻 数位dp
题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...
- 【HDU4507】恨7不成妻(数位DP)
点此看题面 大致题意: 让你求出一段区间内与\(7\)无关的数的平方和.与\(7\)无关的数指整数中任意一位不为\(7\).整数的每一位加起来的和不是\(7\)的整数倍.这个整数不是\(7\)的倍数. ...
- hdu4507 吉哥系列故事——恨7不成妻[数位DP]
这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...
- HDU4507 吉哥系列故事——恨7不成妻 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7' ...
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...
随机推荐
- [luoguP1027] Car的旅行路线(Floyd)
传送门 建图麻烦,建完图搞一遍Floyd就好了. ——代码 #include <iostream> #include <cstdio> #include <cmath&g ...
- poj 3155 二分+最小割求实型最小割(最大密集子图)
/* 最大密集子图子图裸题 解法:设源点s和汇点t 根据胡波涛的<最小割模型在信息学中的应用> s-每个点,权值为原边权和m, 每个点-t,权值为m+2*g-degree[i], 原来的边 ...
- [APIO2012] 派遣 dispatching
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4580 Solved: 2348 Description 在一个忍者的帮派里,一些忍者们被选中派遣给 ...
- Codeforces 513G1 513G2 Inversions problem [概率dp]
转自九野:http://blog.csdn.net/qq574857122/article/details/43643135 题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列 ...
- 简述WEB项目前端脚本的一次重构历程,labJs,requireJs实践[转载]
重构前的状态: 大量的js代码混在繁多的Jsp文件中,对第三方的js库依赖也很杂乱.虽然在部分交互性较强的页面中,将js代码分离到了独立的js文件中,但是代码结构及依赖管理依然很乱.不说新人来了 ...
- python(5)- 基础数据类型
一 int 数字类型 #abs(x) 返回数字的绝对值,如abs(-10) 返回 10 # ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5 # cmp(x, y) 如果 ...
- 2017多校Round2(hdu6045~hdu6055)
补题进度:10/11 1001(不等式) 根据题意列不等式,解一解就行了 1002(套路) 题意: 给定一个随机产生的1e6*1e6的矩阵和一个1e3*1e3的矩阵,你要回答这个1e3*1e3的小矩阵 ...
- Codechef-ANCESTOR(树套树/CDQ分治)
题意: 给定两棵有根树,各有 N 个点.两棵树上的点分别被从 1 到 N 标号.两棵树的根均为标号为 1 的节点. 你的任务非常简单:对于每个 i,找到一个 j(j != i),使得在两棵树中 j 都 ...
- java 定时备份数据库
原文:http://www.open-open.com/code/view/1447490829678 /** 操作数据库 */ public class BackupDb { public Stri ...
- nexus-3本地下载jar的settipng.xml配置
打开maven安装目录下的setting.xml <servers> <server> <id>nexus</id> <username>a ...