\(\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. 单元测试 报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.xxx' 解决

    1.前言 很奇怪 ,单元测试正常执行,但是结束后会报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.e ...

  2. linux 查看历史命令 history命令

    1.history命令 "history"命令就是历史记录.它显示了在终端中所执行过的所有命令的历史. history //显示终端执行过的命令 history 10 //显示最近 ...

  3. kafka时间轮的原理(一)

    概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...

  4. day 11 算法的时间空间复杂度

    (1).有以下程序: 求输入的n值(除1和n)之外的所有因子之和. 分析:这里函数内的循环体i初值不能为零.%是表示"取余",0除以任何数都不会存在余数的,所有是余数为0. (2) ...

  5. 安装DataX的管理控制台(转)

    原文地址 https://github.com/WeiYe-Jing/datax-web/blob/master/doc/datax-web/datax-web-deploy.md 环境准备 1)基础 ...

  6. 收到西门子发来的UG告知函怎么办?Solidworks盗版被查如何防范?厂商是怎么样查到公司在用盗版,有什么方法可以核实真假?……

    收到西门子发来的UG告知函怎么办?Solidworks盗版被查如何防范?厂商是怎么样查到公司在用盗版,有什么方法可以核实真假?--很多企业信息化管理leader或者老板都希望能够通过一些取巧的办法来防 ...

  7. JavaScript中数字常用方法

    数字常用方法 (1)返回0-1(不包含1)随机小数(random()) 格式:Math.random() var num=parseInt(Math.random()*11) //拿到0-10中的随机 ...

  8. 1121day-户别确认

    1.Addinfor.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  9. Python中的路径

    转义 windows路径使用的是\,linux路径使用的是/. 特别的,在windows系统中如果有这样的一个路径 D:\nxxx\txxx\x1,程序会报错.因为在路径中存在特殊符 \n(换行符)和 ...

  10. 只要一行代码,实现五种 CSS 经典布局

    常用的页面布局,其实就那么几个.下面我会介绍5个经典布局,只要掌握了它们,就能应对绝大多数常规页面. 这几个布局都是自适应的,自动适配桌面设备和移动设备.代码实现很简单,核心代码只有一行,有很大的学习 ...