今天调了四个小时的黑题:
首先是细节问题。
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
换了个位置答案变了的原因:
x*x*1ll
时,先算的是x*x
,导致爆了int
,虽然后来乘了1ll
,但是对答案已经没有帮助了.1ll*x*x
时,先算的时1ll*x
,x
变成了long long
类型,然后再乘x
就没有影响
这个故事告诉我们:
- 以后乘法时要把
1ll
乘在前面(没影响也没关系,如果有影响就原地升天) - 不开
long long
见祖宗!!!