正态分布

把标准化结果放大为百分之一整数,直接拆出正态分布表的行号与列号。

OJ: shumeng

题目 ID: CSP202506A

难度:入门

标签:数学模拟

日期: 2026-07-31 16:21

形式化题目

给定查询参数 μ,σ,n\mu,\sigma,n,计算 Z=nμσZ=\dfrac{n-\mu}{\sigma}。在步长为 0.010.01 的正态分布表中,ZZ 的十分位决定行号、百分位决定列号,行列下标均从 11 开始,输出对应的 (i,j)(i,j)

思路

关键是避免浮点误差,把小数定位转换成整数运算。

放大为整数

σ\sigma100100 的因子,所以

nμσ×100=(nμ)×100σ \frac{n-\mu}{\sigma} \times 100 = \frac{(n-\mu)\times 100}{\sigma}

可以精确整除,得到整数 hundredths,它表示 ZZ 的百分位数值。

拆出行列号

hundredths / 10 是十位数(ZZ 的整数部分与十分位),加 11 得到行号;hundredths % 10 是百分位,加 11 得到列号。

代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-31 16:21
 * update_at: 2026-08-17 22:53
 */
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int k;
    cin >> k;
    while (k--) {
        long long mu, sigma, n;
        cin >> mu >> sigma >> n;

        // 标准化的查表值 (n-mu)/sigma,放大 100 倍化为整数。
        // 因为 sigma 是 100 的因子,这里可精确整除,避免浮点误差。
        long long hundredths = (n - mu) * 100 / sigma;

        // 十分位决定行号,百分位决定列号,下标均从 1 开始
        cout << hundredths / 10 + 1 << ' ' << hundredths % 10 + 1 << '\n';
    }
    return 0;
}

复杂度

每个查询 O(1)O(1) 时间、O(1)O(1) 空间。

总结

查表定位本质上是按 0.010.01 的粒度取小数部分。利用 σ100\sigma \mid 100 的性质把除法化为整数乘法,既精确又不需要处理浮点精度问题。