蒟蒻与WA的艰苦斗争 2021-08-24

博主在参加BJOI2018比赛时遇到一个奇怪的编程问题,代码中1ll的位置变化导致了答案的正确性和程序运行的不同。原本使用int类型时,由于1ll*x*x先计算x*x导致整数溢出,而1ll*x*x则避免了这个问题。最终,通过修正1ll的位置和使用long long类型成功解决了样例未过的状况。这个经历提醒我们在编程时注意类型转换和计算顺序,以防止意外的溢出问题。
摘要由CSDN通过智能技术生成

今天调了四个小时的黑题:

[BJOI2018]链上二次求和

首先是细节问题。

update和pushdown开始又写错了……

幸亏最后改了过来。

紧接着奇怪的事情发生了:

样例没过交了上去。

第一次10分。

第二次把更新加上了一个Mod变成了零分。

第一次10分:

t[node].sum=(t[node].sum+1ll*(S2(r)-S2(l-1))*vala%Mod)%Mod
t[node].taga=(t[node].taga+vala)%Mod;

第二次0分:

t[node].sum=(t[node].sum+1ll*(S2(r)-S2(l-1))*vala%Mod+Mod)%Mod;
t[node].taga=(t[node].taga+vala+Mod)%Mod;

这让人很疑惑。

紧接着,样例还是没过。

于是我把

int Quick_Pow(int x,int y)
{
		int ans=1;
		x%=Mod;
		while(y)
		{
			if(y&1)
			{
				ans=1ll*ans*x%Mod;
			}
			x=1ll*x*x%Mod;
			y>>=1;
		}
		return ans;
}

改成了

int Quick_Pow(int x,int y=Mod-2)
{
		int ans=1;
		x%=Mod;
		while(y)
		{
			if(y&1)
			{
				ans=1ll*ans*x%Mod;
			}
			x=x*x*1ll%Mod;
			y>>=1;
		}
		return ans;
}

然后样例就过了

就过了
就过了
就过了

好耶,把1ll换了个位置就能过?
请添加图片描述
????

然后交上去还是零分。

本想开始调线段树

结果开了long long就AC了

????

后来才知道,把1ll换了个位置答案变了的原因:

  1. x*x*1ll时,先算的是x*x,导致爆了int,虽然后来乘了1ll,但是对答案已经没有帮助了.
  2. 1ll*x*x时,先算的时1ll*xx变成了long long类型,然后再乘x就没有影响

这个故事告诉我们:

  1. 以后乘法时要把1ll乘在前面(没影响也没关系,如果有影响就原地升天)
  2. 不开long long见祖宗!!!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值