HDU 4507 有点复杂却不难的数位DP
首先来说,,这题我wrong了好几次,代码力太弱啊。。很多细节没考虑。。
题意:给定两个数 L R,1 <= L <= R <= 10^18 ;求L 到 R 间 与 7 无关的数的平方和
什么数与7 无关?
1 没有数字7
2 不是7的倍数
3 所有数字的和不是7的倍数
我们先来考虑一下 如果这题问的是: L 到 R 间 与7 无关的数有多少个?
这道题该怎么思考? 给一点提示 dp 方程可以写成三维的 num(i,j,k) 其中 i 代表数的位数 j 代表 这个数对7取模的余数 k 代表这个数所有数字和对7取模的值,至于num(i,j,k) 当让就是这种数的个数了, 方程的转化也很简单 从数末尾逐步填数字 l (0~9)的话 num(i+1,(j*10+l)%7,(k+l)%7)+=num(i,j,k);
接下来 我默认你知道 num[i][j][k] 该怎么求了 这个时候 再来考虑一下 L 到 R 间与7 无关的数的和 ? 这个时候不用考虑的太复杂,,因为首先,你在求num[i][j][k]的时候已经求出了所有的满足条件的数的所有可能,要求和,无非就是哪一位的那个数字有多少个。
如果我们的dp是逐步往数的末尾填数 ,这个时候可以这样写 sum(i,j,k)其中i,j,k和num的i,j,k一个意思,然后sum表示满足这种情况的数的和 方程的转换可以写为:同样从数末尾逐步填数字 l (0~9)-- num(i+1,(j*10+l)%7,(k+l)%7)+=sum(i,j,k)*10+num(i,j,k)*l;
再来考虑平方和就比较容易了,,我们知道如果前面的数是a 我们往后面塞一个数字l 那么我们要求的数的平方和是---(10*a+l)^2 也就是100*a*a+20*a*l+l*l
方程我就不写了,,然后接下来的思路都是和上面的类似
贴出渣渣的代码。。。
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include <string>
- #include <cmath>
- #include <algorithm>
- #include <map>
- #include <set>
- #include <queue>
- #include <stack>
- #include<stdlib.h>
- #include <vector>
- using namespace std;
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #define ll __int64
- #define CL(a,b) memset(a,b,sizeof(a))
- #define MAXNODE 100010
- ll MOD=;
- ll s,e;
- ll dp[][][];
- ll wsu[][][];
- ll num[][][];
- ll val[];
- void initval()
- {
- int i=;
- val[]=;
- val[]=;
- for(i=;i<=;i++)
- {
- val[i]=val[i-]*;
- }
- }
- void initdp()
- {
- int i,j,k,l;
- CL(dp,);
- CL(num,);
- CL(wsu,);
- for(i=;i<;i++)
- {
- if(i==)continue;
- dp[][i%][i%]+=i*i;
- wsu[][i%][i%]+=i;
- num[][i%][i%]++;
- }
- num[][][]=;
- for(i=;i<;i++)
- {
- for(j=;j<;j++)
- {
- for(k=;k<;k++)
- {
- for(l=;l<;l++)
- {
- if(l==)continue;
- num[i+][(j+l)%][(k*+l)%]+=num[i][j][k]%MOD;
- num[i+][(j+l)%][(k*+l)%]%=MOD;
- wsu[i+][(j+l)%][(k*+l)%]+=(wsu[i][j][k]*(ll)+(ll)l*(num[i][j][k]))%MOD;
- wsu[i+][(j+l)%][(k*+l)%]%=MOD;
- dp[i+][(j+l)%][(k*+l)%]+=(((ll)l*(ll)l*num[i][j][k])+dp[i][j][k]*+(ll)*(ll)l*wsu[i][j][k]*(ll))%MOD;
- dp[i+][(j+l)%][(k*+l)%]%=MOD;
- }
- // printf("%d %d %d %I64d\n",i,j,k,dp[i][j][k]);
- }
- }
- }
- }
- ll pro(ll n)
- {
- if(n==)return ;
- ll rem=;
- ll nu[];
- int w,i,j,k;
- nu[]=;
- ll tem=n,va;w=,rem=;
- while(tem!=)
- {
- nu[w]=tem%;
- tem/=;
- w++;
- }
- va=;
- int su=;
- ll v=;
- while(--w)
- {
- if(nu[w]==)
- {
- for(i=;i<w;i++)nu[i]=;
- nu[w]=;
- }
- for(i=nu[w]-;i>=;i--)
- {
- if(i==)continue;
- for(j=;j<;j++)
- {
- for(k=;k<;k++)
- {
- if((su+i+j)%==)continue;
- if(((ll)v+(ll)i*val[w]+(ll)k)%==)continue;
- ll pre=(va+(ll)i*(val[w]%MOD))%MOD;
- pre%=MOD;
- rem+=(((pre*pre)%MOD)*(num[w-][j][k]%MOD))%MOD;
- rem%=MOD;
- rem+=dp[w-][j][k]%MOD;;
- rem%=MOD;
- rem+=((((ll)*pre)%MOD)*wsu[w-][j][k]%MOD)%MOD;
- rem%=MOD;
- }
- }
- }
- rem%=MOD;
- va+=(nu[w]*(val[w]%MOD))%MOD;
- va%=MOD;
- v+=nu[w]*(val[w]%);
- v%=;
- su+=nu[w];
- su%=;
- }
- if(v!=&&su!=)rem+=(va*va)%MOD;
- return rem%MOD;
- }
- int main()
- {
- int tt;
- initval();
- initdp();
- scanf("%d",&tt);
- while(tt--)
- {
- scanf("%I64d %I64d",&s,&e);
- ll rs=pro(s-1LL);
- ll re=pro(e);
- ll rem=re-rs;
- rem=rem%MOD;
- if(rem<)rem+=MOD;
- // printf("%I64d %I64d ",rs,re);
- printf("%I64d\n",rem);
- }
- return ;
- }
HDU 4507 有点复杂却不难的数位DP的更多相关文章
- 【HDU 5456】 Matches Puzzle Game (数位DP)
Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...
- 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU - 4389 X mod f(x)(数位dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...
- 【HDU】4352 XHXJ's LIS(数位dp+状压)
题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...
- HDU 4389——X mod f(x)(数位DP)
X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- hdu 3709 Balanced Number(平衡数)--数位dp
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- hdu 2089 记忆化搜索写法(数位dp)
/* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
随机推荐
- 教训 Mac下装windows系统 失败后 磁盘空间丢失
本来Mac上装的是win10 最近老提示快过期了 想到月底就要停止免费更新了 决定装一下win8 然后升级到win10 因为之前有过装win10的经验 所以很轻松 进入Mac 先到bootcamp 取 ...
- GO 输出字符数同时输出这个字符串的字节数
package main import ( "fmt" "unicode/utf8" ) func main(){ var str string str=&qu ...
- Nexus Root Toolkit教程—— 解锁与Root
Nexus Root Toolkit是Nexus系列手机的专属root工具,本工具可为Nexus系列设备提供解锁.root和反解锁,还可以支持重要数据的备份和恢复.本教程以nexus 7二代和Nexu ...
- commons-pool2-中的一些配置
/** * 连接失效检测相关 */ // 空闲时进行连接测试,会启动异步evi ...
- 开源的Owin 的身份验证支持 和跨域支持
http://identitymodel.codeplex.com/ https://identityserver.github.io/ Windows Identity Foundation 6.1 ...
- Sql 高效分页
http://www.111cn.net/database/mysql/46350.htm http://g.kehou.com/t1032617472.html http://www.cnblogs ...
- Row Cache Objects
This latch comes into play when user processes are attempting to access or update the cached data di ...
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁
2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 56 Solved: 16[S ...
- Linux企业级项目实践之网络爬虫(24)——定制规则扩展为垂直爬虫
在垂直搜索的索引建立之前,我们需要到垂直网站上抓取资源并做一定的处理.垂直搜索与通用搜索不同之处在于,通用搜索不需要理会网站哪些资源是需要的,哪些是不需要的,一并抓取并将其文本部分做索引.而垂直搜索里 ...
- 2015第23周一SVN插件安装
之前想把eclipse(3.7)的SVN插件版本从1.8.x降到1.6.x,上午折腾了好久没弄好,先是尝试在线安装,按网上说的1.6.x的url安装不成功(可能是网络问题,下载不到资源),然后尝试下载 ...