1 条题解
-
0
自动搬运
来自洛谷,原作者为

离散小波变换°
有志不在年高,无志空长百岁搬运于
2025-08-24 22:40:01,当前版本为作者最后更新于2022-08-30 08:56:48,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
构造
首先考虑 的测试点。让我们在模 意义下考虑每个运算,其中 是一个模 余 的质数,即 。在这个意义下,所有可能的数组成了一个有限域 ,这里面所有数字的运算都是模 的。
现在构造三维点集 ,其中 的运算都在 下。容易发现,确定了 和 ,那么唯一确定一个 。因此 的大小恰好为 。我们可以把 映射到 内的点。
内的点放在了一个比较特殊的三维空间里。我们可以定义这个空间内的「直线」以及「面」。
现在证明, 内的点不存在三点共线。具体而言,设出某条直线的参数方程 ( 不全为 )。现在将它与 联立:
$$\begin{cases} x=a_1t+b_1 & (1)\cr y=a_2t+b_2 & (2) \cr z=a_3t+b_3 & (3) \cr x+y^2+z^2= 0 & (4) \end{cases}$$将 代入 中,发现:
整理一下系数:
$$(a_2^2+a_3^2)t^2+(2a_2b_2+2a_3b_3+a_1)t+(b_1+b_2^2+b_3^2)=0 $$注意到,如果 在 意义下非 ,这就是一个二次方程,它的根不可能超过 个。如果想要有三点共线,那这个方程必须要是恒等的(也就是等号左侧所有数字均为 ,那就对任意 都合法)。
接着注意到,如果 ,就等价于 。分两类讨论:
- 。此时由于 ,得到 ,与 均为 矛盾。
- 。那么等式两边同时变为 次方(容易发现,由于 ,这一定是个奇数),由于费马小定理,得到 ,推出矛盾。
于是,从 中选出三个点 组成的三元组 可以唯一确定这个空间内的一个平面。这个三元组映射回 这个数集,就对应着原来每个三元组。
现在考虑,这个 空间下到底有多少个平面。考虑设出一个平面的表达式 。请注意,这里面的运算都是在 里的。当 时,我们可以将每个数除以 ,于是相当于 ,一共有 个平面;当 时,,接着考虑 是否为 ,以此类推,这个空间里一共最多只会有 个平面。对于每个平面,将里面的点放到 里,于是 。最终我们还要减掉点数不超过 的那些集合,最终得到的 的值不会超过 。
总结: 内的每个三元组 ,均映射到 下的点三元组 。这 唯一确定了一个平面,这个平面就是某个 。这个构造方案下,。对于 ,即可构造出结果。
下面考虑 的另一个测试点。此时我们不太能用 了,而是需要改用 ,其中 。具体而言,这里面每个数字都表示为 的形式,其中 ,并且 在模 意义下不存在二次剩余。它们的运算同样是封闭的,且对 取模。
修改三维点集 $S=\{(x,y,z)\in\mathbb F_{p^2}^3: x=y^2+z^2\sqrt w\}$。重新证明一下这个三维点集里的点不存在三点共线。
某条直线的参数方程 ( 不全为 )。现在将它与 联立:
$$\begin{cases} x=a_1t+b_1 & (1)\cr y=a_2t+b_2 & (2) \cr z=a_3t+b_3 & (3) \cr x=y^2+z^2\sqrt w & (4) \end{cases}$$将 代入 中,发现:
同样是以 为主元,整理系数:
$$(a_2^2+a_3^2\sqrt w)t^2+(2a_2b_2+2a_3b_3\sqrt w-a_1)t+(b_2^2+b_3^2\sqrt w-b_1)=0 $$当 时,最多只有两个解;当出现三个解时,等号左侧恒等,。
于是,
$$\begin{aligned} a^2_2&=-a_3^2 \sqrt w \cr \end{aligned} $$当 时,发现 ,不符合 不均为 的前提,舍去。否则,我们能找到 的一个乘法逆元,得到 。
那么我们设 。
整理系数,得到:
对于第一个式子,得到 ,两边同时取 (因为 ,于是这一定是个偶数),得到 。根据费马小定理,得到 。再由于 不存在二次剩余,根据欧拉准则,得到 ,矛盾。
于是同样地, 内的点不共线。
证明
注意到对于上述这两种情况,我们已经构造出了一个 的解,也就是 。下面证明,最优解不会小于 。
设 的大小为 ,第 个数存在于 个划分出的集合中。显然有 。接着考虑,含有 的所有子集组成的集合 。将 里所有的 均删除,此时剩下来的 个数,他们组成的二元组出现且仅出现在 内的某个集合里。根据下述引理 ,。
于是,。
引理 :如果 个集合 ,满足 内每个二元组在且仅在一个 内,那么就有 。
证明:
考虑一个有 个顶点的完全图 。这个问题等价于,我们要把 划分为 个更小的完全图 ,使得每条边都出现且仅出现在一个完全图里。
容易构造出一个 的方案:取 为顶点是 以及它们之间的连边组成的完全图,对于剩下来的 条边,取 为,由点集 以及它们之间的连边组成的大小为 的完全图。下面证明,不存在 的方案。
我们给这个完全图 的每个顶点赋值上一个实数 。对于每个划分出来的完全图,定义它的权值:
接着我们定义一组划分方案的权值:
由于每条边 出现且仅出现在了一个 当中,那么在 里, 前面的系数必定是 (考虑将 展开即可发现)。同时,每个点至少出现在了两个 之中,因为它发出来的边连向的点不可能均在一个 里,那样这个 大小就是 ,此时 不符合题设。于是每个 对 的贡献至少为 。那么:
$$S=\left(\sum_{i=1}^n r_i\right)^2+\sum_{i=1}^n d_ir_i,\quad d_i>0 $$也就是说,我们对 的表达式进行了重新整理。
现在假设存在 。我们可以强行令 均为 ,此时是对 列出来的 个方程组成的线性方程组,可以找到一组解使得存在 不为 。但是此时 ,这与上式不符。
因此 。
现在我们需要应用引理 。引理 叙述如下:
$$m^2\sum_{i=1}^m x_i^3\ge \left(\sum_{i=1}^m x_i\right)^3 $$注意到 ,于是 。下述是引理 的证明。
引理 ( 不等式):
若 ,,并且 ,那么 。
证明:
设 ,容易发现 ,于是 是一个上凸函数。根据上凸函数的定义,发现:
$$\begin{aligned} \ln\left(\dfrac{1}{p}a^p+\dfrac{1}{q}b^q\right)&\ge \frac{1}{p}\ln a^p+\frac{1}{q}b^q \cr &=\ln ab \cr \dfrac{1}{p}a^p+\dfrac{1}{q}b^q&\ge ab\cr \end{aligned} $$
引理 ( 不等式):
$$\sum_{i=1}^n |a_ib_i|\le \left(\sum_{i=1}^n|a_i|^p\right)^{\frac{1}{p}}\left(\sum_{i=1}^n|b_i|^q\right)^{\frac{1}{q}} $$其中, 且 。
证明:
根据引理 ,,我们取:
$$\begin{aligned} u_j=\frac{|a_j|}{\displaystyle (\sum_{i=1}^n |a_i|^p)^{\frac{1}{p}}},v_j=\frac{|b_j|}{\displaystyle (\sum_{i=1}^n |b_i|^q)^{\frac{1}{q}}} \end{aligned} $$得到:
$$\begin{aligned} \frac{|a_j\cdot b_j|}{\displaystyle (\sum_{i=1}^n |a_i|^p)^{\frac{1}{p}}(\sum_{i=1}^n |b_i|^q)^{\frac{1}{q}}}&\le \frac{1}{p}\cdot\frac{|a_j|^p}{\displaystyle \sum_{i=1}^n |a_i|^p}+\frac{1}{q}\cdot\frac{|b_j|^p}{\displaystyle \sum_{i=1}^n |b_i|^q} \cr \frac{\displaystyle \sum_{j=1}^n|a_j\cdot b_j|}{\displaystyle (\sum_{i=1}^n |a_i|^p)^{\frac{1}{p}}(\sum_{i=1}^n |b_i|^q)^{\frac{1}{q}}}&\le \frac{1}{p}\cdot\frac{\displaystyle \sum_{j=1}^n|a_j|^p}{\displaystyle \sum_{i=1}^n |a_i|^p}+\frac{1}{q}\cdot\frac{\displaystyle \sum_{j=1}^n|b_j|^p}{\displaystyle \sum_{i=1}^n |b_i|^q}=1 \cr \sum_{j=1}^n|a_j\cdot b_j|&\le (\sum_{i=1}^n |a_i|^p)^{\frac{1}{p}}(\sum_{i=1}^n |b_i|^q)^{\frac{1}{q}} \end{aligned} $$
引理 :
$$m^2\sum_{i=1}^m x_i^3\ge \left(\sum_{i=1}^m x_i\right)^3 $$证明:
取 ,发现:
$$m\sum x_i\le m^{5/3}\cdot \left(\sum x_i^3\right)^{1/3} $$简单变形,发现:
$$m^2\sum_{i=1}^m x_i^3\ge \left(\sum_{i=1}^m x_i\right)^3 $$
目前我们的进度:
要想说明最优的 不会小于 ,只需要证明 。注意到,为了让每一个三元组出现且仅出现在一个 里,于是每个 内的三元组的个数之和,就等于总的三元组元素之和。即:
$$\sum_{i=1}^m\binom{x_i}{3}=\binom{n}{3},\quad x_i,n\ge 3 $$注意到,当 时, 是一个上凸函数。因此发现,。
于是得到:。又因为我们已经构造出了一组 的解,于是我们可以证明 ,并且构造出来的方案在渐进意义下取得了最优解。
代码
#include<bits/stdc++.h> using namespace std; typedef long long i64; namespace Task1{ const int MAXN=23+3; const int MAXM=13824+3; int n=529,p=23,u=0,v=0,w=0; int M[MAXN][MAXN][MAXN]; int N[MAXN][MAXN][MAXN][MAXN]; vector<int> B[MAXM]; int mian(){ up(0,p-1,y) up(0,p-1,z){ int x=((-y*y-z*z)%p+p)%p; M[x][y][z]=++u; } up(0,p-1,a) up(0,p-1,b) up(0,p-1,c) up(0,p-1,d){ if(a==0&&b==0&&c==0&&d==0) continue; if(N[a][b][c][d]) continue; N[a][b][c][d]=++v; up(0,p-1,t){ N[a*t%p][b*t%p][c*t%p][d*t%p]=v; } up(0,p-1,y) up(0,p-1,z){ int x=((-y*y-z*z)%p+p)%p; if((a*x+b*y+c*z)%p==d) B[v].push_back(M[x][y][z]); } } up(1,v,i) if(B[i].size()>=3) ++w; printf("%d\n",w); up(1,v,i) if(B[i].size()>=3){ printf("%d",B[i].size()); for(auto &t:B[i]) printf(" %d",t); puts(""); } return 0; } } namespace Task2{ const int MAXN=25+3; const int MAXM=17576+3; int n=625,p=25,u=0,v=0,w=0; int M[MAXN][MAXN][MAXN]; int N[MAXN][MAXN][MAXN][MAXN]; vector<int> B[MAXM]; struct Node{ int real,imag; Node(int _real,int _imag):real(_real),imag(_imag){} Node(int _value):real(_value/5),imag(_value%5){} Node operator +(const Node t) const { return Node((real+t.real )%5,(imag+t.imag )%5); } Node operator -(const Node t) const { return Node((real-t.real+5)%5,(imag-t.imag+5)%5); } Node operator *(const Node t) const { return Node(((real*t.real+2*imag*t.imag)%5+5)%5,((real*t.imag+t.real*imag)%5+5)%5); } bool operator ==(const Node t) const { return real==t.real&&imag==t.imag; } Node operator -() const { return Node((5-real)%5,(5-imag)%5); } int value(){return real*5+imag;} }; int mian(){ up(0,p-1,yy) up(0,p-1,zz){ Node y(yy),z(zz),x=y*y+z*z*Node(0,1); int xx=x.value(); M[xx][yy][zz]=++u; } up(0,p-1,aa) up(0,p-1,bb) up(0,p-1,cc) up(0,p-1,dd){ if(aa==0&&bb==0&&cc==0&&dd==0) continue; Node a(aa),b(bb),c(cc),d(dd); if(N[aa][bb][cc][dd]) continue; N[aa][bb][cc][dd]=++v; up(0,p-1,t){ N[(a*Node(t)).value()][(b*Node(t)).value()] [(c*Node(t)).value()][(d*Node(t)).value()]=v; } up(0,p-1,yy) up(0,p-1,zz){ Node y(yy),z(zz),x=y*y+z*z*Node(0,1); int xx=x.value(); if((a*x+b*y+c*z)==d) B[v].push_back(M[xx][yy][zz]); } } up(1,v,i) if(B[i].size()>=3) ++w; printf("%d\n",w); up(1,v,i) if(B[i].size()>=3){ printf("%d",B[i].size()); for(auto &t:B[i]) printf(" %d",t); puts(""); } return 0; } } int main(){ int n; scanf("%d",&n); if(n==529) Task1::mian(); if(n==625) Task2::mian(); return 0; }
- 1
信息
- ID
- 8002
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者