发现一种可以在NOI系列比赛里光明正大地使用int128的方式(
  • 板块学术版
  • 楼主AlumKal
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/8/15 19:18
  • 上次更新2023/11/4 10:33:32
查看原帖
发现一种可以在NOI系列比赛里光明正大地使用int128的方式(
380863
AlumKal楼主2021/8/15 19:18

我查 C++ 标准时发现这样一句话:

若整数字面量的值过大,而无法符合任何后缀/底组合所允许的类型,且编译器支持扩展整数类型(如 __int128),则字面量可以被授予扩展整数类型——否则程序非良构。

那可不可以把这个类型通过模板 expose 出来?

#include <cstdio>
#include <cstdlib>

typedef long long ll;
#define randl() (ll(rand()) << 31 | rand())

template <class bigint>
void mian(bigint placeholder) {
    // bigint 是 128 位有符号整数类型
    ll a = randl(), b = randl(), c = randl();
    ll ans = bigint(a) * b % c;
    printf("%lld * %lld %% %lld = %lld\n", a, b, c, ans);
}

int main() {
    mian(123456789012345678901); // 这个数 > 2^64
}

不需要 C++11,完全不使用下划线开头名称,且实测在 NOI Linux 2.0 上结果是正确的。

但是洛谷不能用,CF 上也只有 GNU G++17 9.2.0 (64 bit, msys 2) 可以。

而据我查到的 NOI 系列赛事规范,只要不使用以下划线开头的库函数或宏就行,没有明确禁止使用 128 位整数,所以应该不违规。然而__int128是类型,不是应该本来就能用吗(

又发现了一些看似很厉害实则完全没用的东西

2021/8/15 19:18
加载中...