社区讨论
晶石齁入(77tps可入,如果还没做最好先做再看)
P2054[AHOI2005] 洗牌参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @milg4zv0
- 此快照首次捕获于
- 2025/11/30 16:16 3 个月前
- 此快照最后确认于
- 2025/12/02 22:05 3 个月前
一定要提前思考一下在极端条件下乘法是否会爆掉
假如都为10^10,那么最大为10^20。
就算你这么写
CPPint fastpow(int x,int y)
{
int ans=1;
while (y)
{
if (y%2) ans=(ans%mod*x%mod)%mod;
x=(x%mod*x%mod)%mod;
y/=2;
}
return ans%mod;
}
由于mod最大为10^10+1,这个取模可能无效。
所以还是得写一个快速乘函数避免过大,而其原理和快速幂差不多,由于a*b实际上就是b个a相加,那么我们就可以再根据(a+b)%mod等效于(a%mod+b%mod)%mod的性质来进行一些处理,实际上很好理解
代码如下:
CPPint mul(int a,int b)
{
int ans=0;
while (b)
{
if (b%2) ans=(ans+a)%mod;
a=(a+a)%mod;
b/=2;
}
return ans%mod;
}
这样在计算exgcd的时候就可以把乘法直接改成mul函数,不会担心爆掉,而本蒟蒻在讨论版和题解中逛了一大圈才幡然醒悟,OTZ
回复
共 0 条回复,欢迎继续交流。
正在加载回复...