第四题 小学生计数题

提交文件: counting.cpp

输入文件: counting.in

输出文件: counting.out

时间空间限制: 1 秒, 256 MB

作为 GDOI 的组题人,小 Y 需要整理手中已有的题目,考虑它们的难度以及所考察的知识点,然后将它们组成数套题目。小 Y 希望先能组出第一套题目,为了整套题目具有良好的区分度,在一套题目中:

• 所有题目的难度需要能排成等差数列;(也就是说,若将所有题目按难度从小到大排序,那么每相邻两

题的难度的差相等,这个差叫做公差)

• 每道题目的难度都是公差的倍数,公差不为 0;

• 需要有不少于 L 道题,不多于 R 道题。

现在小 Y 手里已经有了 m 道题目,其中难度为 \(a_i\) 的题有 \(c_i\) 道\((1 ≤ i ≤ n)\)。小 Y 希望能够道,他有多少种不同的方式能够组出一套题目。

在这道题目中,我们认为两种组题方式不同当且仅当 \(∃k(1 ≤ k ≤ m)\),使得一种方案包含第 \(k\) 道题而另一种方案不包含。由于答案可能很大,输出答案对 998244353 取模。

输入格式

第一行三个整数 \(n, m, L, R\),分别表示有多少种不同难度的题目、题目总数、一套题的题数下限和上限。

接下来 \(n\) 行,每行两个正整数 \(a_i\)

, \(c_i\),表示有 \(c_i\) 道难度为 \(a_i\) 的题\((1 ≤ i ≤ n)\)

输出格式

输出一个数,表示组题方案数对 998244353 取模的值

样例数据

6 12 2 3
2 2
4 2
6 2
8 2
12 2
16 2
64

数据范围

对于所有测试点,\(1 ≤ n, c_i ≤ 10^5,0 ≤ a_i ≤ 10^5,m =∑c_i ≤ 10^5,2 ≤ L ≤ R ≤ m\),\(a_i\) 两两不同。

测试点 n m \(a_i\) 特殊性质 1 特殊性质 2
1-4 $≤ 20 $ \(≤ 20\) \(≤ 20\) - -
5-6 $≤ 300 $ \(≤ 300\) $ ≤ 300$ - -
7-8 \(≤ 2000\) \(≤ 2000\) \(≤ 2000\) -
9-10 \(≤ 2000\) \(≤ 2000\) \(≤ 2000\) -
11-12 \(≤ 2000\) \(≤ 2000\) \(≤ 2000\) - -
13-14 \(≤ 10^5\) \(≤ 10^5\) \(≤ 10^5\) -
15-16 \(≤ 10^5\) \(≤ 10^5\) \(≤ 10^5\) -
17-20 \(≤ 10^5\) \(≤ 10^5\) \(≤ 10^5\) - -

特殊性质 1:满足 \(R − L ≤ 10\)

特殊性质 2:满足所有 \(c_i = 1\)

要求一定是倍数,那么就用调和级数行枚举。每次看\(a_i\)为\(i\)的倍数的情况下看当中有多少种选择方案。我们把所有\(a_i\)是\(i\)的倍数的情况提取出一个序列。

首先在输入时可以知道每种难度有多少个题可以选,枚举时每次选择一段连续的区间,区间要求长度大于\(l\)小于\(r\),然后将里面的所有难度题目数量相乘就是在这个区间中合法的数量。很容易发现,如果有\(0\)那么答案就是\(0\),所以0把序列分成了很多段,我们每次只截取一段计算。同时所有数相乘可以通过对他求一个前缀积的形式,设现在区间是\(l\)到\(r\),前缀积为\(t\),那么可以用\(t_r\div t_{l-1}\)来知道中间所有数的乘积。当然,由于要取模,所以还要用逆元。

整理一下思路,对于一个序列,我们先提取出所有的不含0的段,然后对于每个段,我们枚举长度在\(l\)到\(r\)之间的区间,然后对通过前缀积求出他的中间所有数的乘积,可以通过特殊性质1.

考虑再次优化,我们对于一个位置\(x\),如果把他作为区间的结尾,然后可以求出可能的开头,就是那结尾段减去\(l\)和\(r\)就是开头允许的范围\(tl,tr\),设那个位置逆元为\(v_i\),那么就求\(t_x\times v_i\)的和.但是我们可以对\(v\)求一个前缀和s,枚举\(x\)时可以用乘法分配律,直接加上\(t_x\times (s_{tr}-s_{tl-1})\)。复杂度降到\(nlog^2n\),可以通过此题。注意\(0\le a_i\),不要让数组越界。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=998244353;
int n,m,l,r,v[N],lst,x,y,ret,s[N],t[N];
int pown(int x,int y)
{
if(y==0)
return 1;
int p=pown(x,y>>1);
if(y&1)
return 1LL*p*p%mod*x%mod;
return 1LL*p*p%mod;
}
int qumo(int x)
{
return (x%mod+mod)%mod;
}
void solve(int c,int x,int y)//公差为c,从x到y的答案。
{
s[x-1]=t[x-1]=1;
for(int i=x;i<=y;i++)
s[i]=1LL*s[i-1]*v[c*(i-1)]%mod;
for(int i=x;i<=y;i++)
t[i]=(t[i-1]+pown(s[i-1],mod-2))%mod;
for(int i=x;i<=y;i++)//枚举结尾
{
int p=max(x,i-r+1),q=i-l+1;
if(p>q)
continue;
ret=(ret+1LL*s[i]*qumo(t[q]-t[p-1])%mod)%mod;
}
}
int main()
{
// freopen("counting.in","r",stdin);
// freopen("counting.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&l,&r);
for(int i=1;i<=n;i++)
scanf("%d%d",&x,&y),v[x]=y;
for(int i=1;i<=100000;i++)//枚举公差
{
lst=0;
int j;
for(j=0;j*i<=100000;j++)
{
if(!v[j*i])
{
solve(i,lst+1,j);
lst=j+1;
}
}
solve(i,lst+1,j);
}
printf("%d",ret);
return 0;
}

[GDOIpj221D] 小学生计数题的更多相关文章

  1. 30道小学生四则运算题C/C++编程

    软件工程科课上,老师通过实例讲解什么是程序,程序和软件的区别,要求我们通过短时间写一道编程题, 题目就是编写30道小学生四则运算题.以下就是源代码: #include<iostream.h> ...

  2. ZOJ 3955 Saddle Point 校赛 一道计数题

    ZOJ3955 题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于 ...

  3. UOJ#428. 【集训队作业2018】普通的计数题

    #428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...

  4. D. Count the Arrays 计数题

    D. Count the Arrays 也是一个计数题. 题目大意: 要求构造一个满足题意的数列. \(n\) 代表数列的长度 数列元素的范围 \([1,m]\) 数列必须有且仅有一对相同的数 存在一 ...

  5. 【NOIP2017提高A组模拟9.7】JZOJ 计数题

    [NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...

  6. noip模拟44[我想我以后会碰见计数题就溜走的]

    noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...

  7. FJOI2020 的两道组合计数题

    最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...

  8. 「10.16晚」序列(....)·购物(性质)·计数题(DP)

    A. 序列 考场不认真读题会死..... 读清题就很简单了,分成若干块,然后块内递增,块外递减,同时使最大的块长为$A$ B. 购物 考场思路太局限了,没有发现性质, 考虑将$a_{i}$,排序前缀和 ...

  9. hdu-6415 Rikka with Nash Equilibrium dp计数题

    http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...

  10. 【uoj428】普通的计数题

    Portal --> uoj428 Solution 不会胖子的一个log正解qwq只能怂怂滴写分治了qwq ​ 首先就是一个我想不到的转化qwq ​ 我们将第\(i\)次操作加入的数看成一个编 ...

随机推荐

  1. 树链剖分 | 洛谷 P4114 Qtree1

    前言 题目链接:洛谷 P4114 Qtree1 前置知识:树链剖分 题意 给定一棵树,有修改边权和查询两点之间边权最大值两种操作,对于每个查询输出结果. 解析 已经在前置博客里提到,树链剖分 可以将树 ...

  2. python 获取本周 ,上周,本月,上月,本季,上季,今年, 去年的第一天和最后一天

    import datetime from datetime import timedelta now = datetime.datetime.now()# 获取当前月的天数 month = 2days ...

  3. QA|selenium打开浏览器后没有执行后面的代码(get请求)|UI自动化测试

    Q:selenium打开浏览器后没有执行后面的代码(get请求) 代码如图: 原因:webdriver_path应该给的是chromedriver.exe的路径,而不是chrome.exe的路径,写错 ...

  4. Hugging News #0904:🤗 登陆 AWS Marketplace

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. Go语句与表达式深度解析:全案例手册

    关注公众号[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资 ...

  6. Solution -「CF 888E」Maximum Subsequence

    Description Link. 给一个数列和 \(m\),在数列任选若干个数,使得他们的和对 \(m\) 取模后最大. Solution 记录一下犯下的一个 nt 错误. 首先我们有一个显然的 D ...

  7. Modbus动态链接库供多语言使用 | Go

    Modbus协议控制动态链接库 应用场景 基于各门语言都有各自的modbus协议库,且良莠不齐,而且在具体的框架下可能存在版本依赖问题, 而且对modbus协议存在比较多的细节处理,可以查看modbu ...

  8. MySQL系列之主从复制基础——企业高可用性标准、主从复制简介、主从复制前提(搭建主从的过程)、主从复制搭建、主从复制的原理、主从故障监控\分析\处理、主从延时监控及原因

    文章目录 0.企业高可用性标准 *** 0.1 全年无故障率(非计划内故障停机) 0.2 高可用架构方案 1. 主从复制简介 ** 2. 主从复制前提(搭建主从的过程) *** 3. 主从复制搭建(C ...

  9. 基于matomo实现业务数据埋点采集上报

    matomo是一款Google-analytics数据埋点采集上报的平替方案,可保护您的数据和客户的隐私:正如它官网的slogan: Google Analytics alternative that ...

  10. nginx配置解决跨域访问

    场景:前后的分离项目,前端vue框架,打包后放在Tomcat里访问,端口是8080,后端服务端口8058.访问前端项目时,调用后端接口报跨域. 后端环境 正常访问端口8058 经过nginx配置(文末 ...