萌新求助,爆 ll 怎么办
  • 板块学术版
  • 楼主Citnaris
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/29 22:58
  • 上次更新2023/12/30 11:14:14
查看原帖
萌新求助,爆 ll 怎么办
384498
Citnaris楼主2023/12/29 22:58

提示:这个帖子涉及到 iai.sh.cn 正在进行的比赛题目(楼主已经完赛),故不在此粘贴代码,不打算打这个比赛或者已经完赛的并认为自己可能知道怎么修的大佬可以私信一下我,我私发

某个求最小值的题中,我的有一步计算涉及大约 1e9 * 1e9 * 3e5 的数值,很明显,爆 ll 了,输出为负数。于是我把相应的数组换成了 __int128,但是不管怎么改,代码都可能输出小于 0 的数或者小于标准答案的数(由于是求最小值,故正常来讲这种事情不会发生),因此推断仍然是溢出。然而上述 3e23 的数仍在 __int128 的范围内,请问有人能教教为什么会呢。

几点关于代码的基本信息如下(其实就是我觉得可能挂的地方,主要涉及到类型转换),有需代码者(需满足不打这个比赛或者已经甲组完赛)

  • 我对 __int128 取 abs,方法如下
inline __int128 Abs(__int128 x) {
  if (x < (__int128)0) return -x;
  return x;
  • 我的 ans 开的是 long long 类型,以为可以证明最终答案不会超过 1e18,只是中间过程爆了,所以强制类型转换了一下,大概如下
inline __int128 solve(...) {
  return ...; // 此处为 __int128 类型的数
}
...
ans = min(ans, (long long)solve(...));
  • 所有需要 __int128 的地方我都是像如下一样处理的
long long a, b;
__int128 c = (__int128)a * b;
2023/12/29 22:58
加载中...