题目背景


做正经题是不可能做正经题的,这辈子都不可能做正经题的,毒瘤题又不会做毒瘤题,就是水题这种东西,才维持了蒟蒻的信心;

题目描述


这里有N+1 道水题,编号分别为0 ~N+1 ,每道水题都有它自己水的程度,具体为对应编号的每位上的数字的乘积,现在为了能够更好的刷水题,我们需要统计一点小东西,统计给出L,R,A,B四个值,具体统计的内容为编号在LL 到RR 这段区间中水的程度在A 到B 之间的水题的编号和,现在请你编写一个程序来完成这个统计并A掉这道水题,因为结果可能很大,请输出在对P 取模意义下答案;

输入输出格式


输入格式:

第一行两个整数N,P ,接下来一行四个数L,R,A,B 表示一次询问;

输出格式:


一个整数表示统计的结果;

输入输出样例


输入样例#1:

    
输出样例#1: 

说明


0<=N,A,B<=1e18,1<=L<=R<=N,2<= P <= 1e9 +7

%20数据满足A = 0

另外%80数据满足A > 0。

因为是出现过的题,但是我把它的询问方式加强了,所以我就不出部分分了。

分析:


详情见scoi2012blinker的仰慕者,对于那道题询问来说是对于定值k的统计结果,这道题询问的是A - B的统计结果。

但我们发现对于所有数可能的水的程度只可能有40000多种,因为质因子只有2,3,5,7

所以hash一遍后,挨个挨个暴力计算即可

对于N这个数我都设为1e18了,233

AC代码:


# include <iostream>
# include <cstdio>
# include <map>
# include <cstring>
# include <algorithm>
using namespace std;
const int M = ;
const int N = ;
typedef long long LL;
LL mod;
LL L,R,P,state[N],sum[][N],num[][N],p[],c[],K,a[],b[],A,B;int tot,hs[M],z;
void insert(LL x)
{
int k = x % M;
while(hs[k])
{
++k;
if(k >= M)k = ;
}
hs[k] = ++tot;state[hs[k]] = x;
if(!x)z = tot;
}
int id(LL x)
{
int k = x % M;
while(hs[k])
{
if(state[hs[k]] == x)return hs[k];
++k;if(k >= M)k = ;
}
return ;
}
void init()
{
p[] = ;
for(int i = ;i <= ;i++)p[i] = p[i - ] * 10LL % mod;
for(int i = ;i <= ;i++)
{
insert(i);
num[][id(i)] = ;sum[][id(i)] = i;
}
for(int i = ;i <= ;i++)
{
int tmp = tot;
for(int j = ;j <= tmp;j++)
{
LL x = state[j];int v = j,u;
for(LL k = ;k <= ;k++)
{
if(!id(x * k))insert(x * k);
u = id(x * k);
(num[i + ][u] += num[i][v]) %= mod;
(sum[i + ][u] += (sum[i][v] + (k * p[i]) % mod * num[i][v]) % mod) %= mod;
}
}
}
for(int i = ;i <= ;i++)
{
for(int j = ;j <= tot;j++)
{
a[i] = (a[i] + num[i][j]) % mod;
b[i] = (b[i] + sum[i][j]) % mod;
}
}
}
LL dfs(int t,LL pre,LL now,bool lim,bool first)
{
if(!t)return now == ? pre : ;
int u = id(now);
if(!lim && !first)
{
return ((pre * num[t][u]) % mod * p[t] % mod + sum[t][u]) % mod;
}
int q = lim ? c[t] : 9LL;
LL res = ;
for(LL k = ;k <= q;k++)
{
if(now % k)continue;
(res += dfs(t - ,(pre * p[] + k) % mod,now / k,lim && k == q,first && !k)) %= mod;
}
if(first)(res += dfs(t - ,pre,now,lim && !q,first)) %= mod;
return res;
}
LL Dfs(int t,LL pre,bool now,bool lim,bool first)
{
if(!t)return now ? pre : ;
if(!lim && !first)
{
if(!now)
return ((pre * num[t][z]) % mod * p[t] % mod + sum[t][z]) % mod;
return ((pre * a[t]) % mod * p[t] % mod + b[t]) % mod;
}
int q = lim ? c[t] : ;
LL res = ;
for(LL k = ;k <= q;k++)
{
(res += Dfs(t - ,(pre * p[] + k) % mod,now || (!first && !k),lim && k == q,first && !k)) %= mod;
}
return res;
}
LL solve(LL r)
{
int len = ;
while(r)
{
c[++len] = r % p[];
r /= p[];
}
if(!len)c[len = ] = ;
LL ret = ;
if(A == )ret += Dfs(len,,false,true,true);
for(int i = ;i <= tot;i++)if(state[i] >= A && state[i] <= B)
(ret += dfs(len,,state[i],true,true)) %= mod;
return ret;
}
int main()
{
scanf("%lld %lld",&A,&mod);
init();
scanf("%lld %lld %lld %lld",&L,&R,&A,&B);
printf("%lld\n",((solve(R) - solve(L - )) % mod + mod) % mod);
}

[洛谷U22157]刷水题(数位dp)(hash)的更多相关文章

  1. 洛谷P2657 windy数 [SCOI2009] 数位dp

    正解:数位dp 解题报告: 传送门! 这题一看就是个数位dp鸭,"不含前导零且相邻两个数字之差至少为2"这种的 然后就直接套板子鸭(板子戳总结,懒得放链接辣QAQ 然后就是套路 然 ...

  2. 洛谷P2602 数字计数 [ZJOI2010] 数位dp

    正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪 ...

  3. 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]

    题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...

  4. 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...

  5. Mychael原创题 洛谷T23923 Mychaelの水题 【题解】

    原题链接 题目大意: 有来自三个地区的人各a,b,c位,他们排成了一排.请问有多少种不同类型的排法,使得相邻的人都来自不同的地区 \(a,b,c<=200\) 答案取模 题解 弱弱的标程解法 设 ...

  6. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  7. [洛谷P4626]一道水题 II

    题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...

  8. 洛谷P1540 机器翻译 水题 模拟

    注意一下细节,尤其是更新minv时不要更新错. Code: #include<vector> #include<iostream> #include<cstdio> ...

  9. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

随机推荐

  1. 项目中常用git命令操作指令(一般正常的话够用不够再看相关git命令)

    配置git1.首先在本地创建ssh key:ssh-keygen -t rsa -C "github上注册的邮箱" //(一路回车)2.进入c:/Users/xxxx_000/.s ...

  2. 一个SAP开发人员的双截棍之路

    由于种种原因,Jerry最近加入了SAP成都研究院的一个演讲俱乐部,这个俱乐部主要是提高大家的英语演讲能力. 说来Jerry也是大一下期和大二上期一次性高分通过四六级考试的,但是当毕业进入SAP成都研 ...

  3. Node.js Addons翻译(C/C++扩展)

    PS:请先升级Node 6.2.1,Node 升级命令 npm install -g n;n stable.NOde.js扩展是一个通过C/C++编写的动态链接库,并通过Node.js的函数requi ...

  4. (转)编码剖析Spring装配基本属性的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52856465 上回我们已经讲到了Spring依赖注入的第一种方式,现在我们来详解第二种方式,须 ...

  5. JavaSE-25 AWT

    学习要点 关于AWT AWT容器 布局管理器 AWT组件 事件处理 关于AWT java.awt包与子包 AWT软件包 说明 import  java.awt.*; 基本组件使用工具 import  ...

  6. linux 查看分区UUID的两种方法

    1. sudo blkid /dev/loop0: TYPE="squashfs"/dev/loop1: TYPE="squashfs"/dev/loop2: ...

  7. JS中的setInterval 函数体带参数f方法

    1.setInterval(function code,delaytime); 在设置自动调用执行function code时,我们可以采用下面三种方式来解决. 一.采用字符串形式:(参数不能被周期性 ...

  8. tabs标签页的数据缓存

    一进入tabs标签页默认就将所有标签页的数据请求到,并渲染到页面上, 这样如果数据量太大的话会渲染很久, 我的需求就是点击不同的标签时再请求数据,同时对点击过的标签页数据进行缓存,下次点击时不再重新请 ...

  9. 浅谈Link-Cut Tree(LCT)

    0XFF 前言&概念 Link-Cut Tree 是一种用来维护动态森林连通性的数据结构,适用于动态树问题.它采用类似树链剖分的轻重边路径剖分,把树边分为实边和虚边,并用 Splay 来维护每 ...

  10. [POJ] 3539 Elevator

    http://poj.org/problem?id=3539 给定一个电梯,可以上升a,b,c层和回到1层,给定楼高h,求可达层数 lyd讲的同余类BFS,方法是先把三个量压成两个,即把h%a,因为对 ...