神奇O(1)快速乘
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll ksc(ll x,ll y,ll mod)
{
return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}
int main()
{
ll a, b, p;
cin >> a >> b >> p;
cout << ksc(a, b, p);
}
看不懂的可以看这里
(xy-(ll)((long double)x/mody)*mod+mod)%mod; 没看懂(我不过是个数学小垃圾QAQ)
大神这是啥意思啊
蓝书上的法2
为什么这个不行呀 错在哪里
有测试集直接把ab的计算结果直接吞掉了,当ab恰好是一个正好能够比long long的范围大1的时候,a*b算出来是零。可以尝试代码
亲测能过(
我想问的是,a*b没爆的话,为啥还要用模的定义,直接mod p不行吗
x*y不会溢出吗
似乎有一点问题?
对于输入:
12312312312312312 45645645645645645 3
三个数都小于1e18,但是程序输出是1,
而两个乘数都是3的倍数,错了
我还是乖乖用__int128吧
可以先把x和y都对mod取模
__int128 怎么用呀 兄弟
我在OIwiki上看到的 过不了
用这个公式a×b mod c=a×b-[a×b/c]×c([x]表示x下取整)
为什么可以直接a * b,不会乘爆吗
因为转了 long double
ksc函数里不是定义了LL x与LL y吗,第一步就直接x * y了,而1≤a,b,p≤1e18,这样不会爆LL吗
会爆ll,但是自然溢出不会影响答案,因为模的结果<mod
好神奇,,求解释啊啊