【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
【2018.06.26NOIP模拟】T2号码bachelor
题目描述
Mike 正在在忙碌地发着各种各样的的短信。旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质,难道Mike 的好朋友是满足正态分布的?Tom 很好奇。
由于 Mike 有着自己最喜欢的数字 a ,并且 a 的范围是:2≤a≤9 。Tom 从这里入手,发现了一些端倪,假设 Mike 发的电话号码是一个十进制数字 S ,Tom 发现 S 会满足以下三个性质中的一个:
1.S 是 a 的倍数。
2.S 在十进制表示下的各项数字加起来是 a 的倍数。
3.S 的某一位是 a 。
比如说当 a=7 时,21,16,17 这三个数字组成的电话号码都是会被Mike发短信的,他们分别满足 1,2,3 性质。
Tom 在想:如果给你两个自然数 L,R,以及 Mike 最喜欢的数字 a ,在 [L,R] 中有多少个号码是 Mike 要发短信的手机号码,只需要你告诉他这些数字的平方和。比如说 3,7 是合法的,那么你应该输出 32 + 72 = 58 这个数。
当然,由于答案可能很大,你只需要将答案对 109 + 7 取模即可。
输入格式
输入的第一行包括一个正整数 T ,表示总共有 T 组询问。
接下来有 T 行,每行三个整数 L,R,A 。
输出格式
输出包括 T 行,每行一个整数,表示对 10^9 + 7 取模的答案。
输入
3
2 20 6
3 203 7
11 771 2
输出
1884
1593269
32817226
备注
【数据范围】
对于 15% 的数据,0≤L≤R≤10^6,T=1
对于 35% 的数据,0≤L≤R≤10^7,T=1
另外有 25% 的数据,A=2;L=10^k;R=10^v;k和v都是自然数。
对于 100% 的数据,0≤L≤R≤10^18;2≤A≤9;T≤100

#include<bits/stdc++.h>
using namespace std;
#define Mod 1000000007
#define LL long long
int f0[20][10][10][2][2];
int f1[20][10][10][2][2];
int f2[20][10][10][2][2];
//f0个数 f1和 f2平方和
//位数 数位的和 数的大小 是否出现过 是否满位
int a[20],n,m;
LL l,r;
void divide(LL x){
n=0;
while(x){a[++n]=x%10;x/=10;}
for(int i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);
}
int dp(LL x){
if(x<=0)return 0;
memset(f0,0,sizeof(f0));
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
divide(x);
for(int i=0;i<a[1];i++){
f0[1][i%m][i%m][(i==m)][0]+=1;
f1[1][i%m][i%m][(i==m)][0]+=i;
f2[1][i%m][i%m][(i==m)][0]+=i*i;
}
f0[1][a[1]%m][a[1]%m][a[1]==m][1]+=1;
f1[1][a[1]%m][a[1]%m][a[1]==m][1]+=a[1];
f2[1][a[1]%m][a[1]%m][a[1]==m][1]+=a[1]*a[1];
for(int i=1;i<n;i++)
for(int j=0;j<m;j++)
for(int k=0;k<m;k++)
for(int t=0;t<2;t++){
for(int s=0;s<10;s++){
f0[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f0[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+f0[i][j][k][t][0])%Mod;
f1[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f1[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+10LL*f1[i][j][k][t][0]+1LL*s*f0[i][j][k][t][0])%Mod;
f2[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f2[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+100LL*f2[i][j][k][t][0]+20LL*s*f1[i][j][k][t][0]+1LL*s*s*f0[i][j][k][t][0])%Mod;
}
for(int s=0;s<a[i+1];s++){
f0[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f0[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+f0[i][j][k][t][1])%Mod;
f1[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f1[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+10LL*f1[i][j][k][t][1]+1LL*s*f0[i][j][k][t][1])%Mod;
f2[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]=(f2[i+1][(j+s)%m][(k*10+s)%m][(s==m)||t][0]+100LL*f2[i][j][k][t][1]+20LL*s*f1[i][j][k][t][1]+1LL*s*s*f0[i][j][k][t][1])%Mod;
}
f0[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]=(f0[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]+f0[i][j][k][t][1])%Mod;
f1[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]=(f1[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]+10LL*f1[i][j][k][t][1]+1LL*a[i+1]*f0[i][j][k][t][1])%Mod;
f2[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]=(f2[i+1][(j+a[i+1])%m][(k*10+a[i+1])%m][(a[i+1]==m)||t][1]+100LL*f2[i][j][k][t][1]+20LL*a[i+1]*f1[i][j][k][t][1]+1LL*a[i+1]*a[i+1]*f0[i][j][k][t][1])%Mod;
}
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
for(int k=0;k<=1;k++)
ans=(ans+f2[n][i][j][1][k])%Mod;
for(int i=0;i<m;i++)
for(int j=0;j<=1;j++)
ans=(ans+f2[n][0][i][0][j])%Mod;
for(int i=1;i<m;i++)
for(int j=0;j<=1;j++)
ans=(ans+f2[n][i][0][0][j])%Mod;
return ans;
}
int main(){
// freopen("bachelor.in","r",stdin);
// freopen("bachelor.out","w",stdout);
int T;scanf("%d",&T);
while(T--){
scanf("%lld%lld%d",&l,&r,&m);
printf("%d\n",(dp(r)-dp(l-1)+Mod)%Mod);
}
return 0;
}
【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*的更多相关文章
- 2018.07.26NOIP模拟 魔法数字(数位dp)
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...
- 【2018.06.26NOIP模拟】T3节目parade 【支配树】*
[2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...
- 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*
[2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
- 2018.06.26 NOIP模拟 号码(数位dp)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...
- 2018.08.19 NOIP模拟 number(类数位dp)
Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...
- 2018.09.07 Amount of degrees(数位dp)
描述 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和. 例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, ...
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...
- [CSP-S模拟测试]:reverse(数位DP)
题目描述 我们定义: $\overline{d_k...d_2d_1}=\sum \limits_{i=1}^kd_i\times {10}^{i-1}=n(d_i\in [0,9]\ and\ d_ ...
- 2018.11.07 NOIP模拟 异或(数位dp)
传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码
随机推荐
- 对dataframe中某一列进行计数
本来是一项很简单的任务...但很容易忘记搞混..所以还是记录一下 方法一: df['col'].value_counts() 方法二: groups = df.groupby('col') group ...
- webstorm的安装、激活码、更换主题颜色的修改、汉化
一.安装 1.解压webstorm11zh.rar,双击.exe文件,下一步安装,在安装结束前会提示输入激活码,这个从网上随便找一个可用的即可. 二.更换主题颜色: 1.先从网上找一个喜欢的主题颜色, ...
- Kotlin------类和对象(二)
get/set方法 声明一个属性的完整语法是 var <propertyName>[: <PropertyType>] [= <property_initializer& ...
- 使用python编写微信跳一跳的自动脚本
实现思路: 调用adb命令,截图 寻找小小人的底部中心点role(从下到上扫描,直到找到小小人相同像素的点,至于小小人像素点rgb是什么,可以使用photoshop查看) 寻找棋盘最高点top,然后寻 ...
- Oracle登录被拒绝; 权限不足或用户名/口令无效
第一步: 打开CMD命令窗,输入如下命令:sqlplus "/as sysdba",回车 第二步: 输入命令:alter user sys identified by Orcl12 ...
- 虚拟机VMware搭建代码环境
安装git yum install git -y 安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/ins ...
- day22 CMDB 基础部分 (一)
参考博客: http://www.cnblogs.com/alex3714/articles/5420433.html
- NPOI:初次操作(新建Excel)
1. 由于在某些电脑上没有安装office,或者有权限限制,使用COM组件进行读写Excel的话会出现问题, 为此,NPOI是一个很好的选择,NPOI可以在上述环境中满足Office的操作需求,并且功 ...
- C++:哈希
1.基本概念 哈希一般用来快速查找,通过hash函数将输入的键值(key)映射到某一个地址,然后就可以获得该地址的内容. 同样,如果要储存一对值(键值和数据),则也是通过hash函数获得地址来存入.见 ...
- Java复习3.变量.常量.String.
Java 中的变量常量数据类型 20131004 前言: 还是国庆节,无聊的很,就没事复习点Java的知识,其实C/C++基本上是现在大型企业面试的语言,但是多学习点Java是没有坏处的,而且,将来工 ...