2023.1.31 闲话

我看差不多时机到了,可以发闲话了 .

plate_let 提出的一个模乘,好写且跑得飞快 .

原文:https://www.luogu.com.cn/blog/plateIet/modulo .

目标:对于定值 x,m,多组询问每次给一个 aaxmodm .

{x}=xx(小数部分),则

axmodm={axm}m

对于整数 p,令 xmp2ω,其中 ω=64,则

axmodm{ap2ω}m=apmod2ω2ωm=apmod2ω×m2ω

对于估计 xmp2ω,取最近的整数 p 使得 xmp2ω,最后的除法向下取整,可以证明结果是准确的 .

证明:

目标:取 p=xm2ω,答案向下取整时,对于 a2ωm 计算结果准确 .

p2ω=xm+ε,其中 ε[0,12ω) .

于是

{ap2ω}m={a(xm+ε)}m={axm+aε}m={axm}+aεm={axm}m+amε

保证没有问题的条件就是 amε<1,因为 a2ωm 所以肯定对 .

证毕 .

也可以在第二个等号的结果后面直接感性理解得 aε<1m,结果相同 .

plate_let 的实现:

const int P = 998244353;

void calc(int n, int k, int a[]) {
    unsigned long long p = (((unsigned __int128)k << 64) + P - 1) / P;
    for(int i = 0; i < n; i++)
        a[i] = (unsigned)a[i] * p * (unsigned __int128)P >> 64;
}

这份代码中具体的卡常技巧可以看原文,这里就不再说一遍了 .

终 .

posted @   yspm  阅读(100)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示