hihoCoder #1033 : 交错和 (数位Dp)
题目大意:
给定一个数 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 |
样例输入
100 121 0
样例输出
231 题目分析:定义状态dp(len,x,k)表示长度为len,开头数字为x,交错和为k的所有数之和,num(len,x,k)为上述状态的数的个数。则通过递推即可得到这两个状态组,然后构造答案即可。 ps:这道题贼恶心。。。每一步加或乘运算后必须取余,否则结果一定错误。 代码如下:
# include<iostream>
# include<cstdio>
# include<map>
# include<set>
# include<queue>
# include<vector>
# include<list>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const int N=1000000000;
const int mod=1000000007; int bit[20];
LL num[25][10][205];
LL dp[25][10][205];
LL base[20]; bool ok(int x)
{
return x>=-100&&x<=100;
} void init()
{
base[0]=base[1]=1;
for(int i=2;i<=20;++i)
base[i]=(base[i-1]*10)%mod;
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
for(int i=0;i<10;++i){
num[1][i][i+100]=1;
dp[1][i][i+100]=i;
}
int flag=1;
for(int i=1;i<20;++i){
flag*=-1;
for(int j=0;j<10;++j){
for(int k=-100;k<=100;++k){
for(int l=0;l<10;++l) if(ok(k+flag*l)){
num[i+1][j][k+flag*l+100]+=num[i][j][k+100];
num[i+1][j][k+flag*l+100]%=mod;
dp[i+1][j][k+flag*l+100]+=((dp[i][j][k+100]*10)%mod+(num[i][j][k+100]*l)%mod)%mod;
dp[i+1][j][k+flag*l+100]%=mod;
}
}
}
}
} LL solve(LL x,int k)
{
if(x<0) return 0ll;
LL temp=x;
bit[0]=0;
while(x>0){
bit[++bit[0]]=x%10;
x/=10;
}
LL res=0;
for(int i=1;i<bit[0];++i)
for(int j=1;j<10;++j){
res+=dp[i][j][k+100];
res%=mod;
}
int t=0;
int flag=1;
LL tt=0ll;
for(int i=bit[0];i>=1;--i){
int low=(i==bit[0])?1:0;
for(int j=low;j<bit[i];++j){
LL tres=((tt*num[i][j][(k-t)/flag+100])%mod+dp[i][j][(k-t)/flag+100])%mod;
res=(res+tres)%mod;
}
t+=flag*bit[i];
tt=(tt+(bit[i]*base[i])%mod)%mod;
flag*=-1;
}
if(t==k)
res=(res+temp)%mod;
return res;
} int main()
{
init();
LL k,l,r;
//freopen("in.txt","r",stdin);
while(~scanf("%lld%lld%d",&l,&r,&k))
{
LL a=solve(r,k);
LL b=solve(l-1,k);
if(a<b) a+=mod;
printf("%lld\n",a-b);
}
return 0;
}
hihoCoder #1033 : 交错和 (数位Dp)的更多相关文章
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- HihoCoder 1033交错和(数位DP第三题)
(写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...
- hihoCoder1033 交错和 数位DP
题目:交错和 链接:http://hihocoder.com/problemset/problem/1033# 题意:对于一个十进制整数x,令a0.a1.a2.....an是x从高位到低位的数位,定义 ...
- hihoCoder 1033: 交错和
(1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...
- 【hihoCoder】1033: 交错和
初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...
- hihocoder #1301 : 筑地市场 数位dp+二分
题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...
- hihoCoder #1770 : 单调数(数位dp)
题面 我们定义一个数是单调数,当且仅当构成这个数每一个数位都是单调不降或不增的. 例如 \(123\) 和 \(321\) 和 \(221\) 和 \(111\) 是单调的,而 \(312\) 不是单 ...
- hihocoder #1301 : 筑地市场 二分+数位dp
#1301 : 筑地市场 题目连接: http://hihocoder.com/problemset/problem/1301 Description 筑地市场是位于日本东京都中央区筑地的公营批发市场 ...
随机推荐
- 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- FFT快速傅立叶变换的工作原理
实数DFT,复数DFT,FFTFFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换 ...
- UITextView实现图文混排效果
用UITextView实现图文混排效果的展示,首先要禁用UITextView的编辑功能,将属性editable设置为NO 1.首先创建一个NSTextAttachment对象,这个对象有一个image ...
- 用腻了bootstrap的可以试试semantic-ui
semancti-ui介绍 semantic-ui是html/css框架的新贵,是继bootstrap和foundation之后的又一css神器.semantic-ui一出现在github上就受到火热 ...
- arm裸机驱动错误总结
错误001:
- 测试V模型
一:测试V模型 RAD(Rap Application Development 快速引用开发)模型是软件开发过程中的一个重要模型,由于模型构图形似字母V,所以又称软件开发的V模型.他通过开发和测试同时 ...
- MapReduce数据流(二)
输入块(InputSplit):一个输入块描述了构成MapReduce程序中单个map任务的一个单元.把一个MapReduce程序应用到一个数据集上,即是指一个作业,会由几个(也可能几百个)任务组成. ...
- linux安装时出现your cpu does not support long mode的解决方法
如果你确定你的电脑支持64bit且是64bit的宿主系统,则需要修改BIOS中的Inter Virtualization Technology为enabled.
- jQuery中 判断事件
$('button.top').on('mousedown', function() { var $this = $(this); if ($this.hasClass('settop')) { $t ...
- Pattern和Matcher
java util本身提供了Pattern和Matcher(java.util.regex.Pattern,Matcher),两个类均是与正则表达式相关的类,其中: java.util.regex是一 ...