一千万以内的素数个数

场景:~/work/nt/count.cpp 读入 n,数 1..n 里有几个素数。结果是对的,可 n = 10^7 时要跑好几秒。 任务:改写 count.cpp,让 n = 10^7 也能在 1 秒内算完。make 编译(-O2),ti

开始练习 →

修好取模乘法

场景:~/work/nt/mul.cpp 计算 a × b mod m。m 小的时候对,m 接近 10^18 时就错了。 任务:修好 mulmod,让 m 到 10^18 也算对。make 编译后用 sample.txt 自测。 可操作范围

开始练习 →

修好进制转换的边界

场景:~/work/nt/base.cpp 把 n 转成 base 进制。普通的数都对,可 0 输出了空行,很大的数也转错了。 任务:修好 to_base 里的两个 bug。make 编译后用 sample.txt 自测(里面有 0 和 2

开始练习 →

找出费马测试的反例

场景:~/work/nt/fermat.cpp 用「费马测试」判素数:2^(n-1) mod n == 1 就说它是素数。大多数时候对,但不是永远对。 任务:在 ~/题目.txt 给的区间里找一个合数,让 fermat 误判成 prime,

开始练习 →

一百个大数分解质因数

场景:~/work/nt/factor.cpp 分解质因数,结果对,可遇到 10^10 级的大素数就要跑很久。 任务:改写 factorize,让 100 个 10^10 以内的数在 2 秒内分解完,输出格式不变。make 编译(-O2)后

开始练习 →

模意义下的除法

第 1 步:下面是 3·x 除以 7 的余数 第 2 步:3×1 模 7 余 3,不是 1 第 3 步:3×2 模 7 余 6,不是 1 第 4 步:3×3 模 7 余 2,不是 1 第 5 步:3×4 模 7 余 5,不是 1 第 6 步

开始练习 →

逆元的定义

a 关于模 p 的逆元 x,满足 a·x 除以 p 的余数是【0】。

开始练习 →

逆元什么时候存在

a 关于模 p 的逆元存在,当且仅当【0】。

开始练习 →

费马小定理说什么

p 是质数、a 不是 p 的倍数时,费马小定理说 a^(p-1) ≡【0】(mod p)。

开始练习 →

为什么不能直接整数除

在「模 p 计数」里不能直接用整数除法 /,因为【0】。

开始练习 →