题意
有
3 个实数
n ,
a ,
b (
4≤n≤5,5≤a,b≤10 ) ,你求到了一个函数
f(n)=na+nb 的值。
求满足
⌊f(n)⌋=⌊f(n′)⌋ 的
n′ 的变化范围,即
max(n′)−min(n′) 。
Solutions
Sol 1
直接枚举,时间复杂度
O(epsT×max(ans)) ,期望得分:
? pts 。
Sol 2
考虑优化枚举。发现可以利用二分的思想,让精度不断提高。
时间复杂度
O(Tlog10bit) ,单次精度为
10⌊log10ans⌋−bit ,期望得分:
65 pts 。
可以对
10 ,
12 ,
19 号数据点打表,总得分
80 pts 。
Sol 3
这是来自
ouuan 的面向数据和SPJ的骗分方法。
考虑SPJ比较的是绝对误差,并且本题单次询问答案很小,随便试试就可以了,配合Sol 2可以得到更高的分数。
期望得分:
65−100 pts ,
本来分数会更低,但是因为这个题太简单导致出题人不想卡。
int main()
{
long long t, seed, op;
cin >> t >> seed >> op;
if (op) cout << t * 0.00003058;
else cout << t * 0.00001028;
return 0;
}
Sol 4
这是来自
NaCly Fish 的方法。
要求出:使
na+nb 向下取整后相等的
n 的差值,考虑牛顿迭代。
设
y=⌊na+nb⌋ ,
f(x)=xa+xb 。
只要求出
f(x)=y 和
f(x)=y+1 两个方程的解,做差即可。
时间复杂度
O(Tlogy) ,期望得分:
80−100 pts 。
Sol 5
单独考虑
a=b 时的答案,设
y=⌊na+nb⌋=⌊2na⌋ ,
f(x)=2xa 。
做法同
Sol 4,但是因为
f(x) 可以构造出反函数
arcf(x)=a2x ,可以单次
O(1) 询问。
时间复杂度
O(T) ,期望得分
30 pts ,结合
Sol 4可以得到
90 pts 。
Sol 6
发现在
a̸=b 时无法轻松构造
arcf(x) ,所以
Sol 5无法继续扩展,考虑换一种
O(1) 的反函数求法。
可以通过计算和画图发现
f(x) 在区间
[0,+∞) 单调递增,考虑用
g(x)=bxk 去逼近
f(x) ,可以发现当
Δy=1 时,
∣Δx∣ 是很小的。
(其实也可以目力测量或者目力看样例)
因为
∣Δx∣ 很小,考虑用微分计算近似值来替换
arcf(x)Δy≈dy=f′(x)Δx所以可得
Δx 的快速计算式
Δx≈f′(x)dy所以可推导出
Δn′ 的答案
Δn′≈ana−1+bnb−11对于本题极限数据来说,单次绝对误差
δn′≈∣∣∣∣1022×510+1−5−20×5101∣∣∣∣<2×10−8 。
由于本题数据随机生成,发现最大数据绝对误差不超过
10−3 ,可通过本题。
时间复杂度
O(T) ,期望得分:
100 pts 。
Sol 7
这种做法出题人在考试前一天晚上想了出来,发现还真的有人用这种做法过了此题
考虑如何构造
a̸=b 时的
arcf(x) ,发现
ab=exp(blna) ,所以直接做就好。
时间复杂度
O(T) ,期望得分:
100 pts ,
不如Sol6优秀。
评论
发表评论