我查 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
是类型,不是应该本来就能用吗(
又发现了一些看似很厉害实则完全没用的东西