有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置(超出部分就循环,\(2^k\) 的下一个就是 \(1\)),然后相应位置相异或.现在可以执行任意次以上操作:将 \(F\)放于某个位置,执行对应的异或操作.问最后不同的 \(M\)有多少个. Solution 很显然我们可以 \(F\) 放在每一个位置的异或结果都算出来,放在一起,变成一个集合,那…
给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\sum_{i=l}^r f(i \ xor\ x)^2\) Solution 定义 \(S*x={y \ xor \ x|y \in S}\),\((x)_i\) 表示 \(x\) 第 \(i\) 位的值,则所求为 \(\sum_{y\in[L,R]*x} f^2(y)\),差分一下,只需要求 \(\…
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205]; signed main() { cin>>n>>mod; for(int i=0;i<=2*n;i++) { c[i][0]=1; for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } int ans=…
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 998244353; const int N = 505; int qpow(int p,int q) {return ((q&1)?p:1) * (q?qpow(p*p%mod,q>>1):1) % mod;} int n, Q; // Input: a[][],n // Method:…
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. Solution 对于一对 \((i,j), i<j, p[i]<p[j]\),其对 \(k \in (p[i],p[j])\) 有 \(2^{(i-1)+(n-j)}\) 的贡献 于是我们得到了 \(O(n^2 \log n)\) 暴力 考虑枚举左侧的 \(i\),它会与右侧 \(p[j]&g…
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp,设 \(f[i]\) 表示 \(n=i\) 时的答案,则 \[ f[i]=\sum_{j=1}^n [j|K] \cdot C_{i-1}^{j-1} \cdot (j-1)!\cdot f[i-j] \] #include <bits/stdc++.h> using namespace std…
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i \leq 20\),数据组数 \(\leq 100\) Solution 我们考虑将这些数分段,每段刷成区间内的最大值,那么很显然就可以 DP 了 \(f[i][j]\) 表示搞定了前 \(i\) 个数,操作了 \(j\) 次,则转移方程 \[ f[i][j]=\max_k (f[k][j-\fr…
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 Solution 显然 \(f[1]=1\),考虑所有满足 \(f[x]=1\) 的位置 \(b_1,\dots,b_k\),一定有 \(p_{b_1}>p_{b_2}>\dots >p_{b_k}\) 由于 \(b_1=1\),我们要最小化 \(p_1\),所以填入 \(p_{b_i}=…
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先搞一波离散化,把 设 \(f[i][j]\) 表示处理完了 \(a[1\dots i]\),且 \(a[i]\) 在第 \(j\) 个区间内的总和, \(g[i][j]\) 为方案数 考虑运用分段的思想,枚举下一段的结束点 \(p\),以及下一段所在区间 \(k\),就可以暴力转移到 \(f[p][…
你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有盾的可以抵挡一次攻击,有嘲讽的必须先被杀掉,才能杀没有嘲讽的. 你方的 \(n\) 个人排成一排,从左向右依次出击,你知道它们每个是否有剧毒属性(即攻击力为无穷大). 每次出击选定的对方是被色子控制的.问你能打败多少个对方人,求最大值和最小值. 数据组数 \(\leq 100\),所有数据 \(\l…