考试题解20250215

等差数列

CF763 C. Timofey and remoduling

\(n=m\) 时,答案显然为 1 1

\(n\neq m\) 时:

\(b_i\) 为没取模的原等差序列,公差为 \(d\),即 \(b_i = b_{i-1}+d,i\ge2\)\(p_i\) 满足 \(b_{p_i} \bmod m = a_i\)\(p_i\) 即为 \(a_i\)\(b\) 中的下标。

等差数列有 \(b_j - b_i = (j - i) \times d\)

\(w = p_2 - p_1\)\(w\) 即为 \(a_1,a_2\) 对应到 \(b\) 中这两项间隔项数,满足 \(b_j - b_i = w \times d\)\((i, j)\) 共有 \(n - w\) 个:\((1, w+1),(2,w+2),(3,w+3),\dots,(n-w,n)\)

对应到 \(a\)\(a_2 - a_1 \equiv w \times d \pmod m\),统计满足 \(a_i - a_j \equiv w \times d \pmod m\)\((i, j)\) 的个数,设 \(c\) 为其个数,有 \(c = n - w\),则可求出 \(d\)\(w = n - c\)\(d = (a_2 - a_1) \times w^{-1} \bmod m\)

有了公差 \(d\),遍历每一项 \(a_i\),它的前一项为 \(a_i-d\),若 \(a\) 无与其同余的数,则 \(a_i\)为首项。


若有 \(p_i < p_j\),满足 \((a_i - a_j) \equiv w\times d \pmod m\),即 \(a_i,a_j\)\(b\) 中对应的位置应为 \(a_i\)\(a_j\) 前面,但在同余式子中体现出 \(a_i\)\(a_j\) 后面,这是不对的,我们就多统计了一个 \((i, j)\),求错了 \(c\),从而导致答案错误

\[\begin{aligned} (a_i - a_j) &\equiv w\times d &\pmod m\\ (a_i - (a_i + (p_i - p_j) \times d)) &\equiv w \times d &\pmod m\\ -(p_i-p_j)\times d &\equiv w\times d &\pmod m\\ w+p_i-p_j &\equiv 0 &\pmod m\\ \end{aligned}\\ m|(w+p_i-p_j) \]

满足 \((a_i - a_j) \equiv w\times d \pmod m\) 的一个必要不充分条件为:\(m|(w+p_i-p_j)\)\(w+p_i-p_j \le 2n-2\),即当 \(m \le 2n-2\) 时,上述做法可能会出错;\(m > 2n-2\) 时,上述做法一定正确。

对于所有 \(1\le i < j\le m\)

\[\begin{aligned} i &\not\equiv j &\pmod m\\ b_1+i*d&\not\equiv b_1+j*d&\pmod m\\ b_i&\not\equiv b_j &\pmod m \end{aligned} \]

对于所有 \(1\le i \le m\)

\[\begin{aligned} b_i &\equiv b_i &\pmod m \\ b_i &\equiv b_i + d\times m &\pmod m \\ b_i &\equiv b_{i+m} &\pmod m \end{aligned} \]

上述两个式子表明,等差数列 \(b\) 延长后,满足 \(\forall i\in \mathbb{N_+}\)\(b_i \sim b_{i+m-1}\) 为一个长度为 \(m\) 的排列。

\(a\)\([0, m)\cap\mathbb{Z}\) 取补集得到长度为 \(n'\) 的集合 \(a'\)\(a\)\(a'\) 所在的等差数列相同。

\[\begin{aligned} m&\le2*n-2\\ m-2\times n+2&\le0\\ 2\times(m-n)+2&\le m\\ 2\times n'+2&\le m\\ 2\times n'-2&<m \end{aligned} \]

\(a'\) 求一遍可求出公差 \(d\),以及 \(a'\) 的首项 \(a_1'\)。因为 \(\forall i\in \mathbb{N_+}\)\(b_i \sim b_{i+m-1}\) 为一个长度为 \(m\) 的排列。可以看做 \(a'\)\(a\) 的左边,这样 \(a_1 = a_1'+n' \times d\),也可以看做 \(a\)\(a\) 的左边,这样 \(a_1 = a_1' - n \times d\)

总时间复杂度 \(O(n)\)

逆序对数

简化题面:
给定一个正整数 \(n\),求所有长度为 \(n\) 且逆序对数也为 \(n\) 的排列个数,答案对 \(10^9+7\) 取模。\(1\le n\le 10^5\)

设第 \(i\) 个数与 \(1\sim i-1\) 个数产生的逆序对数为 \(x_i\),则第 \(i\) 个数最少可以贡献 \(0\) 个逆序对,最多可以贡献 \(i-1\) 个逆序对,即 \(0\le x_i\le i-1\)。可以原问题转化成不定方程整数解问题:

\[x_1+x_2+x_3+\cdots+x_n=n\\ 0\le x_i\le i-1 \]

的整数解个数。

换元 \(y_i \leftarrow x_i+1\)

\[y_1+y_2+y_3+\cdots+y_n=2n\\ 1\le y_i\le i \]

求出 \(1\le y_i\) 时的答案

\[\binom{2n - 1}{n - 1} \]

利用容斥原理求出不满足 \(y_i \le i\) 的方案数

\(+ ``y_1>1的方案数" +``y_2>2 的方案数" +\cdots+``y_n>n的方案数"\)

\(-``y_1>1且y_2>2的方案数`` - \cdots - ``y_{n-1}>n-1且y_n>n的方案数"\)

\(+``y_1>1且y_2>2且y_3>3的方案数+\cdots\)

\(\cdots\)

例如,\(y_1>1\) 的方案数可以从等式右边 \(2n\) 个数拿出一个数给 \(y_1\)

\[(y_1+1)+y_2+y_3+\cdots+y_n=2n-1 \]

设不合法的 \(y_i\) 的下标 \(i\) 的集合为 \(S\),$\emptyset \neq
方案数:

\[\binom{2n-1}{n-1} - \sum\limits_{\emptyset\neq S\subseteq\{1,2,3,\dots,n\}}(-1)^{|S|+1}\binom{2n-1-\sum_{k\in S}k}{n-1}\\ =\sum\limits_{S\subseteq\{1,2,3,\dots,n\}}(-1)^{|S|}\binom{2n-1-\sum_{k\in S}k}{n-1} \]

直接枚举 \(S\) 时间复杂度为 \(O(2^n)\),考虑优化。

注意到式子的值只和 \(|S|\)\(\sum_{i\in S}i\) 有关,与 \(S\) 具体包括何值无关。

\(f_{i,j}\) 为满足 \(i=|S|,j=\sum_{k\in S}k\)\(S\) 方案数个数。

\[f_{i,i+j}\stackrel{+}{\longleftarrow}f_{i,j}\\ f_{i+1,i+j+1}\stackrel{+}{\longleftarrow}f_{i,j}\\ \]

假设 \(f_{i,j}\) 代表的其中一集合为 \(\{a,b,\dots,c\}\),第一个式子为 \(\{a,b,\dots,c\} \rightarrow \{a+1,b+1,\dots,c+1\}\),第二个式子为 \(\{a,b,\dots,c\}\rightarrow\{1,a+1,b+1,\dots,c+1\}\),这样就可以遍历 \(\{1,2,3,\dots,n\}\) 的所有子集。

要确保 \(\sum_{k\in S}k \le n\) 这样 \(\binom{2n-1-\sum_{k\in S}k}{n-1}\) 才有值,由于 \(S\) 是集合,其数不互相同,\(|S|\) 最大的情况为 \(S=\{1,2,\dots,m\}\),其中 \(m\) 是满足 \(\sum_{k=1}^m k = \frac{(m+1)m}{2} \le n\) 的最大正整数,\(m=O(\sqrt n)\)

则答案为

\[\sum\limits_{i=0}^{m}\sum\limits_{j=0}^{n} (-1)^i \times \binom{2n-1-i}{n-1} \times f_{i,j} \]

总时间复杂度为 \(O(n\sqrt n)\)

#include <bits/stdc++.h>#define rep(it, st, ed) for(int it = (st); it <= (ed); it++)
#define per(it, st, ed) for(int it = (ed); it >= (st); it--)using ll = long long;template<class T>
void qr(T& x) {x = 0;bool s = 0;char c;while(!isdigit(c = getchar())) if(c == '-') s = 1;do x = (x << 3) + (x << 1) + (c ^ 48);while(isdigit(c = getchar()));if(s) x = -x;
}
template<class T>
void qw(T x) {static char _buf[100];int bp = 0;bool sgn = 0;if(!x) return (void)putchar('0');if(x < 0) x = -x, sgn = 1;while(x){_buf[++bp] = x % 10;x /= 10;}if(sgn) putchar('-');per(i, 1, bp) putchar(_buf[i] | 48);
}ll ksm(ll a, ll p, ll mod) {ll res = 1;while(p){if(p & 1) res = res * a % mod;a = a * a % mod;p >>= 1;}return res % mod;
}#define M (((ll)1e9) + 7)
inline int MOD(ll x) { return x >= M ? x - M : x; }
inline void ADD(ll& x, ll y) { x = MOD(x + y); }bool _st;#define N 200005int n;
ll inv[N], fac[N], v[N], f[500][N];
ll C(int x, int y) { return fac[x] * inv[y] % M * inv[x - y] % M; }bool _ed;
int main() {fac[0] = 1;rep(i, 1, N - 1) fac[i] = fac[i - 1] * i % M;inv[N - 1] = ksm(fac[N - 1], M - 2, M) % M;per(i, 0, N - 2) inv[i] = inv[i + 1] * (i + 1) % M;qr(n);rep(i, 0, n) v[i] = C(n + i - 1, n - 1);ll ans = v[n];int siz = 1;while(siz * (siz + 1) / 2 <= n) siz++;f[1][1] = 1;rep(i, 1, siz)rep(j, 1, n){if(i & 1) ADD(ans, M - f[i][j] * v[n - j] % M);else ADD(ans, f[i][j] * v[n - j] % M);if(j + i <= n) ADD(f[i][i + j], f[i][j]);if(j + i + 1 <= n) ADD(f[i + 1][i + j + 1], f[i][j]);}qw(ans);return 0;
}

联通

相似序列

简要题意:给定长度为 \(n\) 的正整数序列 \(a_i\)\(q\) 个询问 \(l_1, r_1, l_2, r_2\),判断 \(a_{l_1\sim r_1}\)\(a_{l_2\sim r_2}\) 是否相似。

长度为 \(m\) 的序列 \(a\)\(b\) 相似为:\(a,b\) 升序排序后,不同位置的数最多只有一个。

保证 \(1\le n,q,a_i\le 10^5, r_1-l_1=r_2-l_2\)

用线段数可持久化权值线段树,哈希一下:给每个值赋个随机权值,当这个值的个数加一时,其哈希值就加其所赋的随机权值。

线段树上二分第一个不同的值 \(p\) 和 最后一个不同的值 \(q\)。若无不同则输出 YES
若不同,则 若其个数差是否小于等于一,且 \(a_{l_1\sim r_1}\)\(b_{l_2, r_2}\)\([p+1, q-1]\) 中的数,则输出 YES,否则输出 NO

#include <bits/stdc++.h>#define rep(it, st, ed) for(int it = (st); it <= (ed); it++)
#define per(it, st, ed) for(int it = (ed); it >= (st); it--)
using ul = unsigned long long;template<class T>
void qr(T& x) {x = 0;bool s = 0;char c;while(!isdigit(c = getchar())) if(c == '-') s = 1;do x = (x << 3) + (x << 1) + (c ^ 48);while(isdigit(c = getchar()));if(s) x = -x;
}#define N 100005
#define V 100000struct SegTree {int l, r;int siz;int c;ul v;
} T[N * 20];
int rt[N], tp = 0;ul am[N];
void pushup(int p) {T[p].v = T[T[p].l].v + T[T[p].r].v;T[p].c = T[T[p].l].c + T[T[p].r].c;
}
void add(int& p, int q, int lv, int rv, int val) {p = ++tp;T[p] = T[q];if(lv == rv) {T[p].v += am[val];T[p].c++;return;}int mid = (lv + rv) >> 1;if(val <= mid)add(T[p].l, T[q].l, lv, mid, val);elseadd(T[p].r, T[q].r, mid + 1, rv, val);pushup(p);
}
::std::pair<int, int> askl(int p1, int q1, int p2, int q2, int l, int r) {if(l == r) return {T[p1].c - T[q1].c - (T[p2].c - T[q2].c), l};int ha = T[T[p1].l].v - T[T[q1].l].v;int hb = T[T[p2].l].v - T[T[q2].l].v;int mid = (l + r) >> 1;if(ha ^ hb) return askl(T[p1].l, T[q1].l, T[p2].l, T[q2].l, l, mid);else return askl(T[p1].r, T[q1].r, T[p2].r, T[q2].r, mid + 1, r);
}
::std::pair<int, int> askr(int p1, int q1, int p2, int q2, int l, int r) {if(l == r) return {T[p1].c - T[q1].c - (T[p2].c - T[q2].c), l};int ha = T[T[p1].r].v - T[T[q1].r].v;int hb = T[T[p2].r].v - T[T[q2].r].v;int mid = (l + r) >> 1;if(ha ^ hb) return askr(T[p1].r, T[q1].r, T[p2].r, T[q2].r, mid + 1, r);else return askr(T[p1].l, T[q1].l, T[p2].l, T[q2].l, l, mid);
}
int ask(int p, int q, int l, int r, int lq, int rq) {if(lq > rq) return 0;if(lq <= l && r <= rq) return T[p].c - T[q].c;int mid = (l + r) >> 1;int res = 0;if(lq <= mid)res += ask(T[p].l, T[q].l, l, mid, lq, rq);if(mid < rq)res += ask(T[p].r, T[q].r, mid + 1, r, lq, rq);return res;
}int n, q, a[N];::std::random_device rd;
::std::mt19937 gen(rd());int main() {qr(n), qr(q);rep(i, 1, V) am[i] = gen();rep(i, 1, n){qr(a[i]);add(rt[i], rt[i - 1], 1, V, a[i]);}while(q--){int l1, r1, l2, r2;qr(l1), qr(r1), qr(l2), qr(r2);#define x second#define y firstauto L = askl(rt[r1], rt[l1 - 1], rt[r2], rt[l2 - 1], 1, V);auto R = askr(rt[r1], rt[l1 - 1], rt[r2], rt[l2 - 1], 1, V);int cnt = ask(rt[r1], rt[l1 - 1], 1, V, L.x + 1, R.x - 1)+ ask(rt[r2], rt[l2 - 1], 1, V, L.x + 1, R.x - 1);if(L.y > 1 || L.y < -1 || R.y > 1 || R.y < -1 || cnt)puts("NO");elseputs("YES");#undef x#undef y}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893547.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python免杀】CS免杀+浅谈Python静态免杀

本文我们再来看看利用python进行静态免杀吧! 先用CS生成 shellcode 把shellcode进行加密放在里面并存放到服务器。 python BS64 shellcode.txt这里为了方便,我们直接放到了kali的apache目录下。 并启动Apache service apache2 start修改加载器的服务器地址后进行一次BS64加密…

【python免杀】浅谈Python静态免杀

本文我们再来看看利用python进行静态免杀吧! 先用CS生成 shellcode 把shellcode进行加密放在里面并存放到服务器。 python BS64 shellcode.txt这里为了方便,我们直接放到了kali的apache目录下。 并启动Apache service apache2 start修改加载器的服务器地址后进行一次BS64加密…

c#桌面winform通过wps调用power point文件播放,播放完立刻退出不留痕迹

c#桌面winform通过wps调用power point文件播放,播放完立刻退出,不留痕迹.c#桌面winform通过wps调用power point文件播放,播放完立刻退出,不留痕迹. 以前一直用微软的office那个interop,愁死了,版本动不动就不对,加上国产化要求,干脆研究了一下换成wps office。原创,转…

【红队武器库】一些C2的隐藏方法记录

介绍 C2是指网络攻击者使用的一种基础架构,用于远程控制受感染的计算机或网络。攻击者可以通过C2系统发送命令和指令,控制受感染的计算机执行各种活动。本文将记录几种隐藏C2的方法。 使用CDN 1、在 (https://www.freenom.com) 注册一个免费域名,并将其绑定到您的 VPS 地址上…

阿里云可观测 2025 年 2 月产品动态

阿里云可观测 2025 年 2 月产品动态

c# 托管堆和垃圾回收的clr的优化

前言 上一章介绍了基本垃圾回收的思路,那么看一下怎么回收的性能提高 正文 优化性能的手段,一般是找到事物的特征,然后利用这种特征进行优化。对象越新,生存期越短。对象越老,生存期越长。回收堆的一部分,速度快于回收整个堆。托管堆在初始化时不包含对象。添加到堆的对象…

HTTP 隧道工具上线C2

前言 太多时候遇到目标不出网了,TCP、ICMP、DNS协议均不通,无法直接与公网的cobaltstrike或者metasploit服务端建立连接。 只能搭建HTTP隧道,那能通过HTTP隧道上线cobaltstrike或者metasploit吗❓ pystinger [1] 就可以做到,那除此之外呢❓ 接下来,我们探究一下其他HTTP隧…

【权限维持技术】Windows文件隐藏(二)

免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。NTFS数据流 “交替数据流(Alternate Data Streams, ADS)”是Windows NTFS文件系统的高级特性。文件中可以包含多…

UML之参与者(Actor)

参与者是需求分析阶段的重要元素,指与待开发系统交互的外部实体,包括人、外部系统、传感器、数据库等。识别参与者需注意区分真正的参与者和传递型参与者。参与者通常用小人图像表示,在UML用例图中与用例通过关联线连接。参与者(Actor)是模型中非常重要的元素,识别参与者…

【权限维持技术】Windows文件隐藏(一)

免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。简介 文件隐藏是后门规避检查的一个重要手段,是权限维持中关键的一环。Windows操作系统可以使用多种方式进行文件…

Deepseek等AI技术冲击下,Salesforce业务岗位如何保住自己的工作?

“世界变化太快了!”——这句话几乎成了每个职场人的口头禅。尤其是对于Salesforce顾问来说,技术的迭代速度更是让人应接不暇。你还记得10年前的Salesforce是什么样子吗?每天穿着正装、打着领带,坐在办公室里从早忙到晚,用着Salesforce Classic,手动部署变更集(Change S…