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

cosf
省选挂48分搬运于
2025-08-24 23:13:30,当前版本为作者最后更新于2025-04-13 19:00:53,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
UBC002F
先说结论:极差最大只有 。具体证明较为复杂,放在最后。这里先放一个计算机验证的链接,代码在题面里,保证在数据范围内有解。
令 表示极差, 表示序列中出现的最小数, 分别表示 的出现次数,令 表示 。
由于太多根号了码起来麻烦,为了简写,$(x)_1 = \sqrt[3]{x}, (x)_2 = \sqrt{x}, (x)_3 = \sqrt{x^2}$。 表示值 的值域。
下面的方法给出了如何构造一组解。
当 时,,所以 ,舍。
当 时,,显然 ,有:
$$\begin{cases} a + b = n & (1)\\ av + b(v + 1) = v(v + 1) & (2) \end{cases} $$得到 。又 ,因此 ,无解。
如果 ,类似 的情况,无解。
因此 。此时要分两类讨论。
1)
此时 。考虑方程:
$$\begin{cases} a + b + c = n & (3)\\ av + b(v + 1) + c(v + 2) = v \times \frac{(v + 1)(v + 2)}{2} & (4) \end{cases} $$得到:
$$b + 2c = v(\frac{(v + 1)(v + 2)}{2} - n) = f_1(v)\\ $$由 易得 。代入计算,有 ,因此 。
2)
此时 。方程化简之后有:
由 且 ,得 。
可以观察到,这两个区间都很小(其中的整点数 ),因此分别带入求解即可。接下来的分讨过程类似,所以就只保留结果了。并且,可以发现,如果 的系数是 ,则根号 前的系数就是 。这点可以加快求出范围的过程。
仅有
此时 有四种可能。
$$\begin{aligned} v \equiv 3 \pmod 6 &\implies v \in ((6n)_2 - 2, (6n)_2)\\ v \equiv 0 \pmod 6 &\implies v \in ((3n)_2 - 2, (3n)_2)\\ v \equiv 1, 5 \pmod 6 &\implies v \in ((2n)_2 - 2, (2n)_2)\\ v \equiv 2, 4 \pmod 6 &\implies v \in ((n)_2 - 2, (n)_2)\\ \end{aligned} $$仅有
此时 有四种可能。
$$\begin{aligned} v \equiv 0 \pmod 6 &\implies v \in ((6n)_2 - 2, (6n)_2)\\ v \equiv 3 \pmod 6 &\implies v \in ((3n)_2 - 2, (3n)_2)\\ v \equiv 2, 4 \pmod 6 &\implies v \in ((2n)_2 - 2, (2n)_2)\\ v \equiv 1, 5 \pmod 6 &\implies v \in ((n)_2 - 2, (n)_2)\\ \end{aligned} $$四个数均有
注:后面发现,前面几种已经完全够了,即不需要这种情况。std 与后面的证明均不会提到此情况。
这个时候就不是 了,而是 。带入就能发现式子从一个二次的变成了一个三次的。
有两种可能的值: 与 。
$$\begin{aligned} v \equiv 0 \pmod 3 &\implies v \in ((6n)_1 - 2, (6n)_1)\\ v \equiv 1, 2\pmod 3 &\implies v \in ((2n)_1 - 2, (2n)_1)\\ \end{aligned} $$
至此,一共分了十四类。不过,去掉 之后,本质不同的 的取值只有 种,分别带入即可。求根可以用
<cmath>库之类的来实现。大常数是乘给 计算的,并不会影响 的输出答案。另外,由于 是根号级别,所以 的和在 量级左右,离 很远。下面是 DerrickLo 实现的 std。
#include<bits/stdc++.h> #define lcm(a,b) ((a)*(b)/__gcd(a,b)) #define int long long using namespace std; int n; vector<int>v2,v3; int a1(int x){return cbrt(x);} int a2(int x){return sqrt(x);} int a3(int x){return cbrt(x*x);} array<int,3> check3(int a,int b,int c,int p){ //x+y+z=n,ax+by+cz=p int x=p-a*n; if(x<0)return{-1,-1,-1}; if(b==a+1){ int cc=x/(c-a); int bb=x%(c-a); if(cc==0)return {-1,-1,-1}; if(bb==0){ if(cc<=1)return {-1,-1,-1}; cc--,bb+=c-a; } if(bb+cc<n)return {n-bb-cc,bb,cc}; return{-1,-1,-1}; } if(x<5)return {-1,-1,-1}; int cc=x/3; if(x%3==0)cc--; if((x-3*cc)&1){ if(cc==0)return{-1,-1}; cc--; } int bb=(x-3*cc)/2; if(bb+cc<n)return {n-bb-cc,bb,cc}; return {-1,-1,-1}; } array<int,4> check4(int a,int b,int c,int d,int p){ //x+y+z+w=n,ax+by+cz+dw=p int x=p-n*a; if(x<6)return {-1,-1,-1,-1}; int dd=x/3-1,cc,bb; if(x-dd*3==3)bb=cc=1; if(x-dd*3==4)bb=1,cc=2; if(x-dd*3==5)bb=2,cc=1; if(bb+cc+dd<n)return {n-bb-cc-dd,bb,cc,dd}; return {-1,-1,-1,-1}; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; for(int i=a2(2*n)-2;i<=a2(2*n);i++)if(i>0)v2.emplace_back(i); for(int i=a2(1*n)-2;i<=a2(1*n);i++)if(i>0)v2.emplace_back(i); for(int i=a2(6*n)-2;i<=a2(6*n);i++)if(i>0)v3.emplace_back(i); for(int i=a2(3*n)-2;i<=a2(3*n);i++)if(i>0)v3.emplace_back(i); for(int i=a2(2*n)-2;i<=a2(2*n);i++)if(i>0)v3.emplace_back(i); for(int i=a2(1*n)-2;i<=a2(1*n);i++)if(i>0)v3.emplace_back(i); for(int v:v2){ auto now=check3(v,v+1,v+2,lcm(lcm(v,v+1),v+2)); if(now[0]!=-1){ for(int j=1;j<=now[0];j++)cout<<v+0<<"\t"; for(int j=1;j<=now[1];j++)cout<<v+1<<"\t"; for(int j=1;j<=now[2];j++)cout<<v+2<<" \n"[j==now[2]]; return 0; } } for(int v:v3){ auto now=check3(v,v+1,v+3,lcm(lcm(v,v+1),v+3)); if(now[0]!=-1){ for(int j=1;j<=now[0];j++)cout<<v+0<<" "; for(int j=1;j<=now[1];j++)cout<<v+1<<" "; for(int j=1;j<=now[2];j++)cout<<v+3<<" \n"[j==now[2]]; return 0; } now=check3(v,v+2,v+3,lcm(lcm(v,v+2),v+3)); if(now[0]!=-1){ for(int j=1;j<=now[0];j++)cout<<v+0<<" "; for(int j=1;j<=now[1];j++)cout<<v+2<<" "; for(int j=1;j<=now[2];j++)cout<<v+3<<" \n"[j==now[2]]; return 0; } auto noww=check4(v,v+1,v+2,v+3,lcm(lcm(lcm(v,v+1),v+2),v+3)); if(noww[0]!=-1){ for(int j=1;j<=noww[0];j++)cout<<v+0<<" "; for(int j=1;j<=noww[1];j++)cout<<v+1<<" "; for(int j=1;j<=noww[2];j++)cout<<v+2<<" "; for(int j=1;j<=noww[3];j++)cout<<v+3<<" \n"[j==now[2]]; return 0; } } assert(0); }
下面来一个证明。
我们需要证明所有的 都存在一个 ,可以对于所有的 ,反推出对应 的范围,只需看它们的并是不是 即可。
在 时可自行验证成立。下证 的情况。下面的所有 均属于 。
分六类讨论,即 模 的余数。
1)
此时有 。
由 得:,保守估计,得 。
由 得:,保守估计,得 。
因此 。
仅有
此时有 $v(\frac{(v + 1)(v + 3)}{3} - n) \in [4, 3n - 7] \cup \{3n - 5\}$,将 忽略。
由 得:,有 。
由 得:,有 。因此 。
仅有
此时有 $v(\frac{(v + 2)(v + 3)}{6} - n) \in \{5\} \cup [7, 3n - 4]$。将 忽略。
则有:。
2)
时 。
不选 时 。
不选 时 。
3)
时 。
不选 时 。
不选 时 。
4)
时 。
不选 时 。
不选 时 。
5)
时 。
不选 时 。
不选 时 。
6)
时 。
不选 时 。
不选 时 。
至此,所有类别均讨论完成。
将所有 项并起来:。循环下来,缺了一个 。
将所有 项并起来:$[18k^2 + 3k + 1, 18k^2 + 9k] \cup [18k^2 + 9k + 2, 18k^2 + 42k + 23]$。循环缺 。
观察缺的项, 缺的数模 余 ,而 缺的数模 余 ,所以它们不会相等。因此,所有数都可以在 的情况下表示出来!
证毕。
- 1
信息
- ID
- 10890
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者