传送门:CodeForce
或者:VOJ
以下python代码是AC的:
#!/usr/bin/python3
mod = 2**64
while True :
try :
abcn = input().split()
a = int(abcn[0])
b = int(abcn[1])
c = int(abcn[2])
n = int(abcn[3])
leng = 1
if a==b and b==c :
leng = 6
elif a==b or b==c or c==a :
leng = 2
ans = 0
if n%2 == 0 :
ans = ( n * ( (n//2-1)*(n//2+2) + (n-2) ) // leng )
else :
ans = ( n * (n//2) * (n//2+1) // leng )
print(ans%mod)
except EOFError:
break
以下C++代码是WA on test 9:
#include <iostream>
using namespace std;
int main()
{
unsigned long long a ,b ,c ,n;
cin>>a>>b>>c>>n;
unsigned long long len=1;
if(a==b&&b==c)
{
len=6;
}
else if(a==b||b==c||c==a)
{
len=2;
}
unsigned long long ans=0;
if(n%2==0)
{
ans=(n*((n/2-1)*(n/2+2)+(n-2))/len);
}
else
ans=(n*(n/2)*(n/2+1)/len);
cout<<ans<<endl;
}
不科学啊,python代码是我根据C++代码改写而来,结果python过了,C++挂了。
我考虑过unsigned long long 的字节长度问题,输入类型问题,编译器问题,溢出问题,比较的时候的类型不同问题。还是不知道为什么啊。明明是一样的代码啊!
本机上8000组随机数,一通胡改,都没找到原因。
WA.png
上次写完博客一天之后就破案了,可是现在才来更新,我也太懒了。
经过与AC的C++代码的人肉diff,终于找到了原因。
首先python代码AC,C++代码WA,只能说明算法是正确的,代码错误出现在书写上。
python整数可以使用无限长度,C++整型却有固定长度。问题可能出现在这里。
ans=(n*((n/2-1)*(n/2+2)+(n-2))/len);
ans=(n*(n/2)*(n/2+1)/len);
事实上,问题出现在上面两行。原因各位看出来了吗,反正当时在场上的时候我是没有看出来的,回来了大眼瞪小眼的也没有看出来。回想起队友之一当时提到乘法逆元,我当时觉得不是,另一个队友也没有反应,没有支持。他自己也不确定,不坚持。确实,曾经有过他坚持提交最后AC的前例,只能说在场上的时候,自己不确定的就要征询队友意见,自己确信的就一定要坚持,这应该是一个队员应该做的吧。
好了,说了这么多,原因是:原本题目说对2**64取模,用unsign long long 是没有错的,错就错在模k系统的除法是需要使用乘法逆元的,当然,也可以使用很多个if-else判断提前相除。
因为这题错失ec-final。。。哭。。。
网友评论