\(\mathcal{Description}\)

  Link.

  有 \(n\) 物品,第 \(i\) 中有 \(a_i\) ,单价为 \(b_i\)。共 \(q\) 次询问,每次查询用不超过 \(c\) 的钱购买种类在 \([l,r]\) 之中的物品,有多少种方案。强制在线;答案对 \(998244353\) 取模。

  \(n\le10^4\),\(q\le5\times10^4\),\(c\le10^3\)。

\(\mathcal{Solution}\)

  快速回答区间询问,最基础但容易被忽略的处理方式——前缀和差。

  考虑第 \(i\) 中物品的 OGF,显然有

\[G_i(x)=\frac{1-x^{(a_i+1)b_i}}{1-x^{b_i}}.
\]

欲求答案 \(\sum_{k\le c}[x^k]\prod_{i=l}^rG_i(x)\),转化为前缀积乘上前缀积的逆,预处理出

\[S_i(x)=\prod_{j=1}^iG_j(x),\\
S^{-1}_i(x)=\prod_{j=1}^iG_j^{-1}(x).
\]

顺带发现 \(G_j(x)\) 和 \(G_j^{-1}\) 长相完全一样,所以这俩也就是换换加减号的事儿。精巧递推一发可以做到 \(\mathcal O(nc)\) 预处理,查询复杂度即求前缀系数和,预先将 \(S_i(x)\) 或 \(S_i^{-1}(x)\) 的系数做前缀和后即为求卷积的某项系数,暴力模拟,则有单次查询复杂度 \(\mathcal O(c)\)。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>
#include <cstring> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) inline int rint() {
int x = 0, s = getchar();
for ( ; s < '0' || '9' < s; s = getchar() );
for ( ; '0' <= s && s <= '9'; s = getchar() ) x = x * 10 + ( s ^ '0' );
return x;
} inline void wint( const int x ) {
if ( 9 < x ) wint( x / 10 );
putchar( x % 10 ^ '0' );
} const int MAXN = 1e4, MAXC = 1e3, MOD = 998244353;
int n, q, a[MAXN + 5], b[MAXN + 5];
int f[MAXN + 5][MAXC + 5], g[MAXN + 5][MAXC + 5]; inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); } inline void init() {
f[0][0] = g[0][0] = 1;
rep ( i, 1, n ) {
memcpy( f[i], f[i - 1], sizeof f[i] );
memcpy( g[i], g[i - 1], sizeof g[i] );
int t;
rep ( j, t = b[i], MAXC ) addeq( f[i][j], f[i][j - t] );
per ( j, MAXC, t = ( a[i] + 1 ) * b[i] ) subeq( f[i][j], f[i][j - t] );
rep ( j, t = ( a[i] + 1 ) * b[i], MAXC ) addeq( g[i][j], g[i][j - t] );
per ( j, MAXC, t = b[i] ) subeq( g[i][j], g[i][j - t] );
}
rep ( i, 0, n ) rep ( j, 1, MAXC ) addeq( g[i][j], g[i][j - 1] );
} int main() {
freopen( "shop.in", "r", stdin );
freopen( "shop.out", "w", stdout ); n = rint(), q = rint();
rep ( i, 1, n ) a[i] = rint(), b[i] = rint(); init(); for ( int ans = 0, l, r, c; q--; ) {
l = ( rint() + ans ) % n + 1, r = ( rint() + ans ) % n + 1, c = rint();
if ( l > r ) l ^= r ^= l ^= r;
ans = 0;
rep ( i, 0, c ) addeq( ans, mul( f[r][i], g[l - 1][c - i] ) );
wint( ans ), putchar( '\n' );
}
return 0;
}

Solution -「多校联训」小卖部的更多相关文章

  1. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  2. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  3. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  4. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  5. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  6. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  7. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  8. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  9. Solution -「多校联训」光影交错

    \(\mathcal{Description}\)   Link.   一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...

随机推荐

  1. 【PowerShell】ASCII与Char之间的转换

    1 [char[]][int[]]$char=65..90 2 $char -join ',' 3 [int[]][char[]]$ascii=$char 4 $ascii -join ',' A,B ...

  2. Go语言命名规范

    一.变量命名规范 变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如DNS)的时候,特有名词根据是否私有全部大写或小写.例子: var apiClient var URLString 二.常量命名 ...

  3. 重大升级!灵雀云发布全栈云原生开放平台ACP 3.0

    云原生技术的发展正在改变全球软件业的格局,随着云原生技术生态体系的日趋完善,灵雀云的云原生平台也进入了成熟阶段.近日,灵雀云发布重大产品升级,推出全栈云原生开放平台ACP 3.0.作为面向企业级用户的 ...

  4. 解读与部署(三):基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  5. nginx+php环境搭建详解(Linux)

    今天在内网环境下,给linux主机安装nginx+php环境,由于是内网环境,只能手动解压缩包进行安装,在这过程中我也着实遇到了一些问题(困扰了我许久),还好最后搭建环境成功了,所以写篇博客记录一下, ...

  6. MATLAB中回归模型

    (1).一元线性回归:数学模型定义      模型参数估计   检验.预测及控制 1.回归模型:   可线性化的一元非线性回归    (2).多元线性回归:数学模型定义 模型参数估计 多元线性回归中检 ...

  7. 微服务架构 | 3.4 HashiCorp Consul 注册中心

    目录 前言 1. Consul 基础知识 1.1 Consul 是什么 1.2 Consul 的特点 2. 安装并运行 Consul 服务器 2.1 下载 Consul 2.2 运行 Consul 服 ...

  8. 【刷题-LeetCode】306. Additive Number

    Additive Number Additive number is a string whose digits can form additive sequence. A valid additiv ...

  9. pytest文档3-测试用例setup和teardown

    用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效(不在 ...

  10. Nginx怎么处理请求的?

    nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的 location,location就是实际地址.   server { # 第 ...