题目大意:

给定一个数 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)的更多相关文章

  1. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

  2. hihoCoder 1033 : 交错和 数位dp

    思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...

  3. HihoCoder 1033交错和(数位DP第三题)

    (写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...

  4. hihoCoder1033 交错和 数位DP

    题目:交错和 链接:http://hihocoder.com/problemset/problem/1033# 题意:对于一个十进制整数x,令a0.a1.a2.....an是x从高位到低位的数位,定义 ...

  5. hihoCoder 1033: 交错和

    (1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...

  6. 【hihoCoder】1033: 交错和

    初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...

  7. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  8. hihoCoder #1770 : 单调数(数位dp)

    题面 我们定义一个数是单调数,当且仅当构成这个数每一个数位都是单调不降或不增的. 例如 \(123\) 和 \(321\) 和 \(221\) 和 \(111\) 是单调的,而 \(312\) 不是单 ...

  9. hihocoder #1301 : 筑地市场 二分+数位dp

    #1301 : 筑地市场 题目连接: http://hihocoder.com/problemset/problem/1301 Description 筑地市场是位于日本东京都中央区筑地的公营批发市场 ...

随机推荐

  1. “人少也能办大事”---K2 BPM老客户交流会

    主题:固铂轮胎工作流项目分享-K2 SmartForm下的工作流快速开发 嘉宾:王彦(固铂轮胎IT资深经理) 国内业务规模越来越大,流程越来越复杂,跨部门跨组织的流程纸质审批非常复杂,内控的要求越来越 ...

  2. (转载)java常见的ClassNotFoundException

    1 - java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory   添加包common-logging.jar2 ...

  3. 记录一些容易忘记的属性 -- UIKeyboard

    //UIKeyboardWillShowNotification这个通知在软键盘弹出时由系统发送    //UIKeyboardWillShowNotification 通知:键盘将要显示的通知    ...

  4. Non-Programmer's Tutorial for Python 3/File IO

    File I/O Here is a simple example of file I/O (input/output): # Write a file with open("test.tx ...

  5. JVM-对象的存活与死亡

    当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...

  6. linux安装时出现your cpu does not support long mode的解决方法

    如果你确定你的电脑支持64bit且是64bit的宿主系统,则需要修改BIOS中的Inter Virtualization Technology为enabled.

  7. CSS练习一(模仿163邮箱登陆)

    // '); code = code.replace(/&/g, '&'); return code; }; var runCode = function (code) { if (c ...

  8. zoj1610 线段树

    //Accepted 804 KB 40 ms //整个题,都是坑 //1.The first line of each data set contains exactly one integer n ...

  9. MySQL中like的使用方法

    Like的运用场合主要在模糊查询的时候,一般以查询字符串居多,这里据一些例子来说他的一般用法: <1>查询name字段中包含有“明”字的:例 select * from table1 wh ...

  10. html<textarea>标签

    最近在项目中页面回显<textarea>的值,可是设置了value属性怎么也回显不出来,后来才弄清楚,原来想要设置<textarea>的文本,不是使用value,而是如下方式: ...