对于会溢出的乘法,除了__int128之外还有几个方法
1.类似于快速幂的思想,只不过把加法换成乘法,
快速幂:(res=Pi p^i*[a_i==1]),将连乘改成连加
快速乘:(res=Sigma p^i*[a_i==1]),时间复杂度O(log)
2.利用long double来在过程中替代long long
再在接下来的计算中强制转换类型
ll temp=(ld)x/MOD*y;
ll res=(ull)x*y-(ull)z*MOD;
注意,这个x/MOD*y的顺序很重要,保证不会溢出
上面的式子实际上就是余数的定义式
3.分配律
((a+b)*(c+d)equiv(ac+bd+ad+bc)(modp))
合理的拆分可在O(1)时间内算出解,但是应用范围较局限
可以考虑类似辛普森积分的方法递归拆分,但是还不如上面的优秀
最好用的还是__int128了,只是编译环境不统一可能是个大坑
——2020.5.3