[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 ...
随机推荐
- 【转】MVP和MVC的区别
转自:http://www.cnblogs.com/end/archive/2011/06/02/2068512.html MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里, ...
- URL与URI的区别
URI—Universal Resource Identifier通用资源标志符Web上可用的每种资源如HTML文档.图像.视频片段.程序等都是一个来URI来定位的URI一般由三部组成①访问资源的命名 ...
- 移动端(IOS)iframe监听不到 onscroll 事件
问题描述: 我在一个页面A中有瀑布流,点击瀑布流中的图片需要进入到另外一个页面B,点击返回需要回到页面A中点击的位置,为了实现该效果所以在页面A中嵌入iframe,iframe指向页面B,页面B中同样 ...
- javascript获取标签样式(获取背景为例)
function getStyle(el){ if(window.getComputedStyle){ return window.getComputedStyle(el,null); } retur ...
- NodeJs获取不到POST参数
NodeJs报错,从网页端获取不到POST参数,提示错误类似如下 TypeError: Cannot read property 'username' of undefined at C:\U ...
- SQL从入门到基础 - 06 限制结果集范围
一.限制结果集行数 1. Select top 5* from T_Employee order by FSalary DESC 2. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...
- hadoop文本转换为序列文件
在以前使用hadoop的时候因为mahout里面很多都要求输入文件时序列文件,所以涉及到把文本文件转换为序列文件或者序列文件转为文本文件(因为当时要分析mahout的源码,所以就要看到它的输入文件是什 ...
- MySQL 数据库操作命令汇总
此文全部都是基本的数据库语言 1.登陆到mysql >mysql -h hostname -u username -p 然后等待系统提示输入密码即可登陆.如果想在登陆的时候就选择好数据库,可以使 ...
- 关于本地$.get(url,function(data)),异步获取数据
起初 此处url为本地同目录下的html片段 $.get(url,function(data) { alert(url); $("#gallery").append(data); ...
- C/C++ char和int的区别
字符字面值一般是用一对单引号来表示.char类型一般就是用字符字面值来初始化.赋值.由于char类型的是单字节长度,当给char类型的变量用字符字面值赋值时,当单引号里面的内容超过一个字节时,系统会自 ...