Description

快要到七夕了,又到了交(nue)往(gou)的季节。
恶梦坐在教室里,作为一个纯屌丝的他当然不会关心要送什么礼物给女生,然而他的前桌yves却在忙碌着各种各样的的短信。
恶梦注意到yves发短信给的电话号码似乎都满足着特别的性质,难道yves的"好朋友"是满足正态分布的?
由于yves有着自己最喜欢的数字a,2 <= a <= 9
恶梦从这里入手,发现了一些端倪。
假设yves发的电话号码是一个十进制数字S
恶梦发现S会满足以下三个性质中的一个
1. S是a的倍数。
2. S在十进制表示下的各项数字加起来是a的倍数。
3. S的某一位是a
比如说当a = 7时,21,16,17这三个数字都是会被yves发短信的,他们分别满足1,2,3性质。
恶梦很担心所有的女同学都被yves抢走了,但他一下子又数不过来那些同学没有被yves抢走,所以他把这个问题交给了你。
他会给你两个自然数L,R,以及yves最喜欢的数字a,
他并不希望你告诉他在[L,R]中有多少个同学没有被抢走,而希望你告诉他这些数字的平方和。
比如说3,7是合法的,那么你应该输出3^2 + 7^2 = 58这个数。
当然,由于答案可能很大,你只需要将答案对10^9 + 7取模即可。

Input

输入的第一行包括一个正整数T,表示总共有T组询问。
接下来有T行,每行三个整数L,R,A。

Output

输出包括T行,每行一个整数,表示对10^9 + 7取模的答案。

Sample Input

32 20 63 203 711 771 2

Sample Output

1884159326932817226

Data Constraint

对于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

题解

  • 题目大意:给定一个区间,问区间内不满足以上所有条件的数的平方和
  • 显然数位DP,设f[i][j][k][l]为当前枚举到第i位(从高到低),前i位是否与R的前i位相同,当前的数对A取模的余数为k,当前的数位和对A取模的余数为l的方案数
  • 再设s[i][j][k][l]为这些数的和,g[i][j][k][l]为这些数的平方和
  • 转移也挺简单的,我们现有状态为(i, same, mo, sum),然后枚举一个当前位置选的数ch
  • 首先ch不能等于A,而且当same=1时,当前位不能大于R的当前位
  • 然后就直接转移就好了,答案就是∑g[1][same][mo][sum]

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #define ll long long
 5 using namespace std;
 6 const ll MO=1e9+7;
 7 ll n,m,ans,l,r,a,f[40][2][10][10],g[40][2][10][10],s[40][2][10][10],K[40];
 8 ll calc(ll x)
 9 {
10     ll p=x,tot=0; memset(K,0,sizeof(K)),memset(f,0,sizeof(f)),memset(g,0,sizeof(g)),memset(s,0,sizeof(s));
11     while (p) K[++tot]=p%10,p/=10;
12     f[tot+1][1][0][0]=1;
13     for (ll i=tot;i>=1;i--)
14         for (ll j=0;j<=1;j++)
15             for (ll mo=0;mo<=a-1;mo++)
16                 for (ll sum=0;sum<=a-1;sum++)
17                     if (f[i+1][j][mo][sum])
18                         for (ll ch=0;ch<=9;ch++)
19                             if (ch!=a&&(!(j&&ch>K[i])))
20                             {
21                                 ll b=(j&&ch==K[i]),c=(mo*10+ch)%a,d=(sum+ch)%a;
22                                 f[i][b][c][d]=(f[i][b][c][d]+f[i+1][j][mo][sum])%MO;
23                                 s[i][b][c][d]=(s[i][b][c][d]+10ll*s[i+1][j][mo][sum]%MO+f[i+1][j][mo][sum]*ch%MO)%MO;
24                                 g[i][b][c][d]=(g[i][b][c][d]+100ll*g[i+1][j][mo][sum]%MO+20ll*ch*s[i+1][j][mo][sum]%MO+ch*ch*f[i+1][j][mo][sum]%MO)%MO;
25                             }
26     ll ans=0;
27     for (ll j=0;j<=1;j++) for (ll mo=1;mo<=a-1;mo++) for (ll sum=1;sum<=a-1;sum++) (ans+=g[1][j][mo][sum])%=MO;
28     return ans;
29 }
30 int main()
31 {
32     scanf("%lld",&n);
33     while (n--)
34     {
35         scanf("%lld%lld%lld",&l,&r,&a);
36         printf("%lld\n",(calc(r)-calc(l-1)+MO)%MO);
37     }
38 }

转载于:https://www.cnblogs.com/Comfortable/p/10335970.html

[数位dp] Jzoj P4239 光棍相关推荐

  1. [数位DP]JZOJ 3363 Number

    Description JYY 来到了一个新的城市,为了和大家保持联系,第一件事就是办理新的手机号.JYY 对号码的要求很高,希望大家都能够顺畅地阅读手机号,因此 JYY 特别研究了地球人的电话号码阅 ...

  2. 【数位DP】好数(jzoj 1521)

    好数 jzoj 1521 题目大意: 定义好数为转换为二进制后,有至少三个连续的位相同的数,现在要求一个范围内的好数个数 样例输入 0 16 样例输出 5 数据范围限制 0 <= Low < ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  5. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  6. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  7. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  8. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  9. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

最新文章

  1. linux操作系统的两种桌面环境,Linux操作系统中常见的桌面环境介绍
  2. 【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
  3. Fescar锁和隔离级别的理解
  4. The IEEE 802.15.4 MAC layer
  5. BXUG第11期活动
  6. android打包成apk会屏蔽注解,Android解决混淆打包之后注解被去掉的问题-Go语言中文社区...
  7. (八)构建一个Docker容器来训练Deep Fake Autoencoders
  8. js my_first
  9. 原版Caffe在Windows10 VS2015 python3.7 CPU版本 详细安装笔记 BVLC caffe
  10. macbook历代_历代MAC机型配置汇总
  11. 【安全知识分享】2021年安全生产月活动方案(附下载)
  12. 【人事管理系统2.0 Linq to SQL】企业人事管理系统
  13. 我的读书笔记 -《狼道智慧》
  14. 云之讯php,云之讯短信开发
  15. 数据中台推不动?手把手教你落地搭建!
  16. R语言安装TSA包(windows) 2020年5月
  17. 玩转现代家居风格 高冷却处处透着温馨
  18. 0504反常积分-定积分
  19. Backbone入门指南(二):依赖库Underscore
  20. 5G商用的赋能应用阐述,5G物联网应用案例

热门文章

  1. 吉林考生多少分能考上哈工大计算机专业,福建考生多少分能上哈工大?
  2. 3DShader之移位贴图(Displacement Mapping)
  3. keras下的线性回归实例
  4. 用vector编写一个矩阵模板
  5. android 组件大小,Android编程获取组件尺寸大小的方法
  6. 干货!全网最全一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  7. 基于DGCNN和概率图的三元组信息抽取模型
  8. python glob用法_python glob的安装和使用
  9. 计算机应用基础案例教程习题答案,计算机应用基础案例教程习题答案
  10. mysql行锁表怎么办_mysql - 表锁,行锁