[SHUPC 2024] 函数 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求计算函数 在
个询问点
上的取值,允许
的误差。核心解法是利用三角恒等式把
化简为下取整函数
,从而避免对原式做高精度浮点计算。
分析
核心观察
由 以及
返回主值区间的性质,可以把
精确表示成只与
小数部分有关的量;代入原式后恰好消去
与
,最终结果就是
。
思路
设 ,其中
,
为小数部分。由于
,有
。
因为 以
为周期:
又 ,且
保证
,恰好落在
的主值区间内,于是:
代入原式:
因此每个询问的答案就是 。若直接按原式用浮点计算
,当
接近
时
的浮点表示误差会使结果完全失真,所以必须使用化简后的形式。
具体示例
以 为例:
,
,则
,于是
。同理,直接验证
、
、
,与样例输出一致。
算法步骤
- 读入询问组数
T。 - 对每个询问,读入浮点数
x,计算ans为(可用
floor函数实现)。 - 输出
ans,保留位小数。
复杂度分析
时间:
空间:
实现注意事项
- 输入保证
,即
,
总有定义,且小数部分
使主值恒等式严格成立。
- 切勿直接按原式计算:
最大可达
,double 无法精确表示
,取
时会严重失真。
- 因
且不是整数,
即为其整数部分,用 floor 函数或向零取整均可。
- 输出保留
位小数与样例格式一致;本题按误差判定,直接输出整数同样正确。
,输入数据较多,建议开启快速输入输出。
源代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
cout << fixed << setprecision(6);
while (T--) {
double x;
cin >> x;
cout << floor(x) << '\n';
}
return 0;
}
import sys
from math import floor
def main():
data = sys.stdin.buffer.read().split()
t = int(data[0])
out = []
for i in range(1, t + 1):
x = float(data[i])
out.append(f"{floor(x):.6f}")
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
main()
评论