[GDOIpj221D] 小学生计数题
第四题 小学生计数题
提交文件: 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] 小学生计数题的更多相关文章
- 30道小学生四则运算题C/C++编程
软件工程科课上,老师通过实例讲解什么是程序,程序和软件的区别,要求我们通过短时间写一道编程题, 题目就是编写30道小学生四则运算题.以下就是源代码: #include<iostream.h> ...
- ZOJ 3955 Saddle Point 校赛 一道计数题
ZOJ3955 题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于 ...
- UOJ#428. 【集训队作业2018】普通的计数题
#428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...
- D. Count the Arrays 计数题
D. Count the Arrays 也是一个计数题. 题目大意: 要求构造一个满足题意的数列. \(n\) 代表数列的长度 数列元素的范围 \([1,m]\) 数列必须有且仅有一对相同的数 存在一 ...
- 【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 ...
- noip模拟44[我想我以后会碰见计数题就溜走的]
noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...
- FJOI2020 的两道组合计数题
最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...
- 「10.16晚」序列(....)·购物(性质)·计数题(DP)
A. 序列 考场不认真读题会死..... 读清题就很简单了,分成若干块,然后块内递增,块外递减,同时使最大的块长为$A$ B. 购物 考场思路太局限了,没有发现性质, 考虑将$a_{i}$,排序前缀和 ...
- hdu-6415 Rikka with Nash Equilibrium dp计数题
http://acm.hdu.edu.cn/showproblem.php?pid=6415 题意:将1~n*m填入一个n*m矩阵 问只有一个顶点的构造方案. 顶点的定义是:某数同时是本行本列的最大值 ...
- 【uoj428】普通的计数题
Portal --> uoj428 Solution 不会胖子的一个log正解qwq只能怂怂滴写分治了qwq 首先就是一个我想不到的转化qwq 我们将第\(i\)次操作加入的数看成一个编 ...
随机推荐
- [ABC129E] Sum Equals Xor
2023-01-15 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 dp/模拟 解题思路 我们都知道,异或是一种不进位的加法,而要想 $ a ...
- TIDB - 分布式数据库
TIDB(一) 重点 TIDB核心 数据存储-RocksDB Raft 协议 选举 数据同步 MVCC 表数据与kv映射关系 索引数据与kv 映射关系 元数据和sql 层计算 PD调度 HTAP 特性 ...
- Python 基础面试第二弹
1. 解释下Python中的面向对象,以及面向对象的三大特点: 在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的 ...
- 在编写API接口的技术文章时应注意的内容
编写API接口的技术文章时,建议包含以下内容: 1. 简介:介绍API接口的目的和作用,以及所属的项目或服务. 2. 接口描述:详细描述API接口的功能和使用方法,包括输入参数.输出结果和可能的错误码 ...
- Codeforces 1257E - The Contest
题意 三个人,每个人有一些数字,组合起来是\(1\)-\(n\),每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人拥有\(1\)-\(i\)的数,第二个人拥有\(i+1\)-\(j\)的 ...
- 一个.NET 7 + DDD + CQRS +React+Vite的实战项目
项目简介 基于SignalR实现聊天通信,支持横向扩展,可支撑上万用户同时在线聊天 后端架构 后端技术栈采用 .NET 7 PostgreSQL (业务数据库) Redis(用于存放热点数据,和支持S ...
- Solidity-变量和数据类型[基本类型]
在solidity语言中,变量和数据类型分为三类:基本类型(bool.int.address等),复合类型(array.struct.mapping等)和特殊类型(enum.function.modi ...
- Spring Event 观察者模式, 业务解耦神器
观察者模式在实际开发过程中是非常常见的一种设计模式. Spring Event的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式. 一.什么是观察者模式 概念: 观察者 ...
- docker bridge网络类型研究
bridge模式是docker的默认网络模式,使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能.可以使用iptables -t nat -vnL ...
- elementui vue表单提交向别的组件传参失效 路由传参格式
目录 表单提交向别的组件传参失效 路由传参格式 表单提交向别的组件传参失效 methods: { submitForm(formName) { this.$refs[formName].validat ...