\(\mathcal{Description}\)

  Link.

  给定 \(n\) 和 \(q\) 次询问,每次询问给出 \(x,k\),求第 \(x\) 位为 0 且任意两个 1 的下标之差不小于 \(k\) 的长度为 \(n\) 的 01 序列数量。

  \(n,q\le10^5\)。

\(\mathcal{Solution}\)

  “不小与 \(k\)”可能在复杂度中体现为“\(\div k\)”,考虑根号分治。

  对于 \(k\le\sqrt n\),预处理 \(f(k,i)\) 表示不考虑 \(x\) 的限制,长度为 \(i\) 的序列数量。通过全局答案减去 \(x\) 位为 1 的答案可以 \(\mathcal O(1)\) 回答询问;

  而对于 \(k>\sqrt n\),1 的数量 \(\le\sqrt n\),枚举 1 的数量,把 0{k-1}1 看做一整块,可以隔板法求方案,在用总方案减去左右方案之积即可 \(\mathcal O(\sqrt n)\) 回答询问。

  最终,得到复杂度最坏为 \(\mathcal O((n+q)\sqrt n)\) 的算法。

\(\mathcal{Code}\)

/* Clearink */

#include <cmath>
#include <cstdio> #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 ) const int MAXSN = 316, MAXN = 1e5, MOD = 998244353;
int n, q, thres, f[MAXSN + 5][MAXN + 5], fac[MAXN * 2 + 5], ifac[MAXN * 2 + 5]; inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int mul( const long long a, const int b ) { return int( a * b % MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
} inline void init() {
fac[0] = 1;
rep ( i, 1, 2 * n ) fac[i] = mul( i, fac[i - 1] );
ifac[2 * n] = mpow( fac[2 * n], MOD - 2 );
per ( i, 2 * n - 1, 0 ) ifac[i] = mul( i + 1, ifac[i + 1] ); rep ( i, 1, thres ) {
int* fi = f[i]; *fi = 1;
rep ( j, 1, n ) fi[j] = add( fi[j - 1], j >= i ? fi[j - i] : 1 );
}
} inline int comb( const int n, const int m ) {
return n < 0 || n < m ? 0 : mul( fac[n], mul( ifac[m], ifac[n - m] ) );
} int main() {
freopen( "color.in", "r", stdin );
freopen( "color.out", "w", stdout ); scanf( "%d %d", &n, &q ), thres = sqrt( n ); init(); for ( int x, k; q--; ) {
scanf( "%d %d", &x, &k );
if ( k <= thres ) {
printf( "%d\n", sub( f[k][n], mul( x >= k ? f[k][x - k] : 1,
n + 1 >= x + k ? f[k][n - x - k + 1] : 1 ) ) );
} else {
int all = 0, lcnt = 0, rcnt = 0;
rep ( i, 0, ( n + k - 1 ) / k ) {
all = add( all, comb( n + k - 1 - i * k + i, i ) );
lcnt = add( lcnt, comb( x - 1 - i * k + i, i ) );
rcnt = add( rcnt, comb( n - x - i * k + i, i ) );
}
printf( "%d\n", sub( all, mul( lcnt, rcnt ) ) );
}
}
return 0;
}

Solution -「多校联训」染色的更多相关文章

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

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

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

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

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

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

  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. 用软碟通UltraISO刻录Win 10 1909 到U盘,只有1个G左右,安装不了系统

    之前一直用软碟通刻录WIN10的ISO镜像到U盘.最近想到用最新版的WIN10 1909 来做一个U盘系统,刻录也成功了.就是安装系统的时候总报错,找了很久原因,终于发现刻录后占用U盘的空间只有1G左 ...

  2. 用jquery实现省市联动

    <!-- 需求: [1] 动态生成省份选择框. [2] 当选择了省份的某一项时, 动态改变 城市选择中的列表项. --> <!DOCTYPE html> <html la ...

  3. Spark-寒假-实验1

    (1)切换到目录 /usr/bin: $ cd /usr/bin (2)查看目录/usr/local 下所有的文件: $cd /usr/local $ls   (3)进入/usr 目录,创建一个名为 ...

  4. 模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]

    1.axios 函数对象(可以作为函数使用去发送请求,也可以作为对象调用request方法发送请求) ❀ 一开始axios是一个函数,但是后续又给它添加上了一些属性[ 方法属性] ■ 举例子(axio ...

  5. 树形dp空间优化(dfn)

    树形dp空间优化 介绍 有时题目会告诉我们n叉树的最大层数,或者给出一个完全n叉树树,直接做树形dp会爆空间时,就可以用这个优化方法. 多数树形dp都是先dfs到子树,再合并到根上,显然当合并到根上时 ...

  6. java-异常-异常处理原则

    1 异常处理的原则: 2 * 1,函数内部如果抛出需要检测的异常,那么函数上必须要声明. 3 * 否则必须在函数内用trycatch捕捉,否则编译失败. 4 * 5 * 2,如果调用到了声明异常的函数 ...

  7. centos6下php53升级为php7

    1.查看版本 [root@web-1 blog]# php -v No log handling enabled - turning on stderr logging Created directo ...

  8. ORACLE数据库误操作DELETE并且提交数据库之后如何恢复被删除的数据

    一:根据时间来恢复: 1.查询数据库当前时间() select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 2.查询删除数据时间点之前的数据 ...

  9. 学习JAVAWEB第十天

    今天内容: 运行servlet到崩溃,一直是404 明天继续运行

  10. Ubuntu更换镜像源

    不同的源 当修改sources.list文件时,我们需要将下面任意一个镜像源的代码复制粘贴到该文件中. 阿里源 # 阿里镜像源 deb http://mirrors.aliyun.com/ubuntu ...