【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. 如何选择正确的angular2学习曲线?

    参考: https://www.zhihu.com/question/50800464/answer/122921043 https://www.zhihu.com/question/48670501 ...

  2. JS/jQuery 遍历对象属性

    Javascript For/In 循环: 循环遍历对象的属性 var person={fname:"John",lname:"Doe",age:25}; fo ...

  3. Redis-CentOS7安装

    安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统. ...

  4. 获取url参数,替换特殊字符

    function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...

  5. 原生javascript-Tab选项卡-面向对象

    分析个人用原生JS获取类名元素的代码: getByClassName:function(className,parent){ var elem = [], node = parent != undef ...

  6. 大白话,讲编程之《ES6系列连载》汇总

    如果你经历过2,3年前的前端开发,你一定感受过兼容IE6,7的痛苦,一定用过网页三剑客的dreamweaver编写html,面试的时候面试官一定会问你:会用PS切图吗? 刚开始的时候你发现,web前端 ...

  7. Python之路,Day9 - 线程、进程、协程和IO多路复用

    参考博客: 线程.进程.协程: http://www.cnblogs.com/wupeiqi/articles/5040827.html http://www.cnblogs.com/alex3714 ...

  8. Python执行Linux系统命令方法

    Python执行Linux系统命令的4种方法 (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码代码如下: system(command) -> ...

  9. iptables详解(11):iptables之网络防火墙

    我们一起来回顾一下之前的知识,在第一篇介绍iptables的文章中,我们就描述过防火墙的概念,我们说过,防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防 ...

  10. 自研发RPC调用框架

    自主研发设计RPC远程调用框架,实现服务自动注册,服务发现,远程RPC调用,后续实现服务负载均衡 主要包括:客户端服务,服务端,服务发现,服务注册 github地址:https://github.co ...