[hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和
- 例子输入
-
100 121 0
- 例子输出
-
231
描写叙述
给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数:
f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1
比如:
f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4
给定

输入
输入数据仅一行包括三个整数。l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100)。
输出
输出一行一个整数表示结果,考虑到答案可能非常大,输出结果模 109 + 7。
提示
对于例子 ,满足条件的数有 110 和 121,所以结果是 231 = 110 + 121。
很多其它例子:
| Input |
| 4344 3214567 3 |
| Output |
| 611668829 |
| Input |
| 404491953 1587197241 1 |
| Output |
| 323937411 |
| Input |
| 60296763086567224 193422344885593844 10 |
| Output |
| 608746132 |
| Input |
| 100 121 -1 |
| Output |
| 120 |
中文题=_=题目出处来自hihocoder第一次挑战赛,xiaodao出题。
刚開始做的时候脑洞开大了以为是数论专题,后来才发现是数位dp,几个easy易卡住的点:
1.记忆化搜索写的时候要将同样交错和的个数。同样交错和的数字的和分别进行dp
2.对于一位数字和两位数字的计算方式并不同样,要分数字的位数进行讨论。
3.因为结果可能比較大,每一步都须要使用同余定理,以防运算过程中爆long long的情况。
记忆化搜索的思路。
当前的交错和同样的数字的和=sum(待搜索的状态的数字和+当前搜索的数字的大小*当前搜索到的符合条件的数字个数)。
#include <cstdio>
#include <cstring>
long long mod=1000000007;
long long base[20];
long long l,r,k,bit[20],bt,yy;
struct node {
long long s,n;//s代表数字和,n代表数字个数
};
node dp[20][400];//状态转移
node dfs(long long pos,long long target,long long limit)//数位dp,基本能够算是模板啦
{
node t;
t.s=t.n=0;
if (pos==0) { //处理到最后一位。直接推断返回
if (target==100)
t.n=1;
return t;
}
if ((limit==0)&&(dp[pos][target].n!=-1)) return dp[pos][target];
long long tail=limit? bit[pos]:9;
long long sgn=((yy-pos)%2)? (-1):(1);//确定符号
long long head;
if (pos==yy)head =1;
else head=0;//确定搜索的起点和终点
for (int i=head;i<=tail;i++)
{
node tmp=dfs(pos-1,target-i*sgn,(limit==1)&&(i==bit[pos]));
if ((tmp.n)>0){
t.n+=tmp.n;
long long q;
q=((((tmp.n%mod)*base[pos])%mod)*i)%mod;//结果的同余处理
t.s+=(tmp.s)%mod;
t.s%=mod;
t.s+=q;
t.s%=mod;//每一步都要同余
}
}
if (limit==0) dp[pos][target]=t;
return t;
}
long long cal(long long x,long long y)
{
long long ans=0;
if (x==-1) return 0;
if (x==0) return 0;
bt = 0;
while (x)
{
bt++;
bit[bt]=x%10;
x/=10;
}
for (yy=1;yy<=bt;yy++){
memset(dp,-1,sizeof dp);
ans+=dfs(yy,y+100,yy==bt).s;//对于每一个长度为yy的数字进行处理
ans=(ans+mod)%mod;
}
return ans;
}
int main()
{
base[1]=1;
for (int i=2;i<=19;i++)
base[i]=(base[i-1]*10)%mod;
scanf("%lld%lld%lld",&l,&r,&k);
{
printf("%lld",(cal(r,k)-cal(l-1,k)+mod)%mod);
}
return 0;
}
[hihocoder 1033]交错和 数位dp/记忆化搜索的更多相关文章
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
- 【poj1850】 Code 数位dp+记忆化搜索
题目大意:给你一个字符串,问你这个字符串的rank,如果这个字符串不合法,请直接输出0.(一个合法的字符串是对于∀i,有c[i]<c[i+1]) 字符串s的rank的计算方式:以字符串长度作为第 ...
- [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)
3598: [Scoi2014]方伯伯的商场之旅 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 449 Solved: 254[Submit][Sta ...
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- 1026-windy数+数位DP+记忆化搜索
1026: [SCOI2009]windy数 题意:数位DP模板题: 目前只理解了记忆化搜索,就想练练手, ------给递推写法留一个位子 ------ 注意这道题要判断前导0的情况,1 )可以加一 ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- hdu3652 数位dp记忆化搜索
从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算 #include<bits/stdc++.h> using namespace std; #define ll long lo ...
随机推荐
- [React] React Router: Querystring Parameters
Define query param in Link, accept path and query : const Links = () => <nav > <Link to= ...
- GPG error [...] NO_PUBKEY [...]
今天在Linux下遇到这个问题,发现很多资料都是英文的,为了方便出现同样错误的有英语阅读困难的人,整理解决方案如下: sudo apt-key adv --keyserver keyserver.ub ...
- Android文字的复制和粘贴
Android中提供了简单的额复制粘贴功能.代码很简单 复制文字的代码: ClipboardManager cbm= (ClipboardManager) MainActivity.this .get ...
- tail-head
[root@rusky]# tail test3 #不加参数默认显示全部内容 line line2 line3 line4 line5 line6 line7 line8 line9 line10 [ ...
- linux内存机制
~# free -m total used free shared buffers cachedMem: 16086 8579 7507 0 152 800 ...
- ubuntu server 14.04.4 无线网卡没有启用,找不到wlan0端口
Ubuntu Server默认的情况下是不会启用无线网卡的,想想实际服务器上怎么可能有无线网卡呢,呵呵.所以我们需要手动来启用无线网卡,难点就在这里了. 使用ifconfig命令,发现没有wlan口, ...
- Xshell 4的上传与下载
http://blog.csdn.net/lioncode/article/details/7921525
- XenServer 使用笔记
XenServer 模拟千兆网卡 这两天用 XenServer 安装 VM,其中一台 VM 是用作无盘测试的 Linux Server,不在主流发行版之列,无奈 XenServer 日前对非主流的 L ...
- CSS3动画(360度旋转、旋转放大、放大、移动)
Title div { width: 120px; height: 120px; line-height: 120px; margin: 20px; background-color: #5cb85c ...
- 关于html控件和服务器控件摁回车后提交按钮的问题
今天做项目用到,项目是一个洗车系统,刷卡后在焦点出自动触发回车键事件,如,一个文本框,把焦点放入,刷一下卡,文本框自动获取卡号,同时触发回车事件,(就像银行办卡一样),发现刷卡后页面刷新后并没有执行按 ...