【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】*的更多相关文章

  1. 2018.07.26NOIP模拟 魔法数字(数位dp)

    魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...

  2. 【2018.06.26NOIP模拟】T3节目parade 【支配树】*

    [2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...

  3. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  4. 2018.06.26 NOIP模拟 号码(数位dp)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...

  5. 2018.08.19 NOIP模拟 number(类数位dp)

    Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...

  6. 2018.09.07 Amount of degrees(数位dp)

    描述 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和. 例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, ...

  7. [CSP-S模拟测试]:密码(数位DP+库默尔定理)

    题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...

  8. [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_ ...

  9. 2018.11.07 NOIP模拟 异或(数位dp)

    传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码

随机推荐

  1. spring-boot 加入拦截器Interceptor

    1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationIntercepto ...

  2. vue-cli background iamge

    vue-cli 可以将图片直接放在项目生成的 static 文件夹里,然后在components里面直接采用绝对路径去取就可以了. 在根目录里面都会有一个static目录,这个是用来存放静态文件的,把 ...

  3. C4 文件和目录:APUE 笔记

    C4: 文件和目录 本章主要讨论stat函数及其返回信息,通过修改stat结构字段,了解文件属性. struct stat结构定义如下: struct stat { __dev_t st_dev; / ...

  4. head first python选读(5)

    python web 开发 犯了低级错误,这本书看了一半了才知道书名应为<head first python>,不是hand first.. 现在开始一个web应用. 总算是熟悉的内容了. ...

  5. vs 2017 保存文件 utf8

    vs 2017 保存文件 utf8 转自:https://blog.csdn.net/jiegemena/article/details/79369650

  6. Android-----代码实现打开手机第三方应用APP

    最近做一个项目,有一个需要启动第三方应用,和微信的地图查看差不多,需要启动高德,百度或腾讯地图来查看:特来分享,希望有所帮助. 案例效果如图: 要想启动第三方:首先要知道他的包名 一:高德 高德:co ...

  7. 1012: [JSOI2008]最大数maxnumber 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=1012 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数 ...

  8. shell---正则表达式和文本处理器

    -----正则表达式----- grep -n  :显示行号 -o  :只显示匹配的内容 -q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 -l  :如果匹配成功 ...

  9. ansible modules开发(一)

    一 模块说明 官方是否有提供的类似功能模块? 可从下面两个连接确定官方提供的模块,以免重复造轮子 官方已发布的模块 http://docs.ansible.com/ansible/modules.ht ...

  10. JavaScript---事件监听

    JavaScript的事件监听是通过addEventListener()来实现的 它算是事件绑定的第二种方式. 他的特别之处在于这种绑定事件的方法不会被同名事件覆盖. 看具体的demo <!DO ...