O(1) long long快速乘

很久以前做题的时候看到的。

inline long long multi(long long x,long long y,long long mod)
{
    long long tmp=(x*y-(long long)((long double)x/mod*y+1.0e-8)*mod);
    return tmp<0 ? tmp+mod : tmp;
}

利用了long double 在某些系统下大于64bit的特性。因此如果评测机的long double是64bit时会WA。
由于浮点数的精度限制,mod不能太小,必须在1e18的级别。实测mod = 1e9+7时,x = 1e18,y = 1e18时会错。

posted @ 2024-09-28 14:12  寻找繁星  阅读(0)  评论(0编辑  收藏  举报