疑似NOJ数据有误
本文略长,若有可能,请逐行耐心看完。 
本人24小登,第一次发文,先叠甲。 
高二打过OI,CCF6级,洛谷杀紫200+,C/C++码量估计万行级别。 
平时摆,不太做NOJ,今晚稍微做了一下,发现有两道题比较...卡手。 
 
这里是某一道题的题目描述。 
快速幂模板,注意到2^63取等,所以必开ull. 
同时注意到,快速幂过程中,可能出现两个数相乘爆掉ull的情况。 
原因已经解释得很清楚了,并且我记得我曾因为爆ull却没写龟速乘WA过。 
所以,我自然是使用龟速乘 (下文的mul函数) 代替了直接相乘,能够证明,mul函数不可能爆ull。 
注释内是测试数据,那么有: 
所以答案为: 
结果也确实是这样: 
样例也是必过的。 
然后交了。 
结果WA. 
很疑惑。 
回想起之前教过一个同学,当时直接用的快速幂,虽然我也意识到会爆ull的问题,但还是想让那位同学WA了之后再思考原因,就没有提醒。 
但ta后来也没问我。 
莫非...不用龟速乘? 
于是考虑把mul()给换成原来的。 
内心os:怎么可能不用龟速乘?难道两个2^63级别的数相乘没问题?莫非数据规模不够大?那我的代码怎么可能WA? 
😰 
然后交了一份这样的: 
还是WA. 
反复尝试后发现可能是必须要故意无符号整型溢出的,可能是我一开始想太多。 
😨 
又把输出 power(a%c,b,c) 中 %c 去掉。 
然后上面的这东西, 
输入 100000000000 2 10,得 8 
😰多可怕啊,告诉你1000亿的平方除以10,余数得8的这堆东西,AC了。 
不 是 ,这 也 能 A C 了 ?! 
san值狂掉( 
关于为什么输出8的解释: 
所以合理猜想,出题人没考虑到爆ull这事,所以有自然溢出的代码得以通过,而未自然溢出的代码不能通过。 
至于 hack 数据,只要超过10^12左右,随机就能造出一堆来,根本不用手动构造。 
😖所以究竟是我的想法有问题还是出题人数据造错了??? 
大家如果有感兴趣的,可以给你的AC程序试一试这组数据,查看结果是否正确。 
各位如果发现我的代码确实有问题,也欢迎在评论区指正,不玻璃心谢谢🙏 
 
另外类似的还有这题: 
我看到数据范围,直接O(T)容斥,也开了long long,就是过不了,结果告诉我只用 int,O(NT) 的 for 循环就可以过掉吗? 
比较难绷的是上面的代码过不了,下面的代码能过。 
?虽然只是新手题,但好歹需要严谨一些吧,如果不行,数据范围就不要开那么大,OI中的数据基本都会触碰到上界的。 
而这里用 int 能过,O(1) long long 过不掉的原因,大概又是令人讨厌的溢出问题吧。 
简单计算了一下,确定了溢出范围: 
所以n>95935处的 if 判断完全是我有意为之。 
所以是否标程中同样使用 int,又同样出现溢出问题? 
再次叠甲:我的等差数列求和代码(开 long long)已经和网上找到的能AC的代码对拍过,在 n≤65535 范围下完全没问题。并且在提交时已用 assert 验证程序确实会进入 else 分支。 
 
所以希望有大佬和我探讨一下究竟是确实如此,还是我的代码中存在错误🥹 
另外如果有同学感兴趣,也可以和我讨论讨论这背后的社会现象☺ 
 
?怎么都到早上6点了(逃 
2024-09-29
浏览1313
翱翔峰会(学习论坛)
登录后评论
5
9