U444102 reverse 加强
题目描述
题面同 [reverse](https://h.hszxoj.com/d/hzoitg/p/T812?tid=667e65fe6ef739b3adadb695),**但范围不同**
为避免输入误差,输入提供数据生成器,输出直接将所有的结果相加,对 $2^{64}$ 取模。
输入格式
使用见注释
输入 seed 作为种子
```
#include
using namespace std;
namespace DATA {
constexpr unsigned long long DTA = 1e19 - 9999;
long long idx;
long long MT[624];
void Seed(long long seed) {
idx = 0;
MT[0] = seed;
for (long long i = 1; i < 624; i++) {
long long t = 1812433253 * (MT[i - 1] ^ (MT[i - 1] >> 30)) + i;
MT[i] = t & 0xffffffffffffffff;
}
}
void generate() {
for (int i = 0; i < 624; i++) {
long long y = (MT[i] & 0x8000000000000000) + (MT[(i + 1) % 624] & 0x7fffffffffffffff);
MT[i] = MT[(i + 397) % 624] ^ (y >> 1);
if (y & 1) MT[i] ^= 2567483615;
}
}
long long Rand() {
if (idx == 0)
generate();
long long y = MT[idx];
y = y ^ (y >> 11);
y = y ^ ((y 18);
idx = (idx + 1) % 624;
return y;
}
unsigned long long Getl() {
if (Rand() % 50)
return Rand() % 10000 + 1;
else
return Rand() % int(1e19) + 1;
}
unsigned long long Getr() {
if (Rand() % 50)
return Rand() % 10000 + DTA;
else
return Rand() % int(1e19) + 1;
}
}
using DATA::Getl;
using DATA::Getr;
using DATA::Seed;
int main() {
unsigned long long seed;
cin >> seed;
Seed(seed); //Set seed
for (int i = 1; i r) swap(l, r); // Get l ans r
// Work with l and r
}
}
```
输出格式
输出所有组的**和**,对 $2^{64}$ 取模。
说明/提示
样例 2 使用了正确输入输出格式
可能有点卡常,但 std 没有特意卡常
实在卡也可以给数据生成器和其他函数开 inline ,可能会快,但 std 没加。
时限在 std 1.5 倍以上
**注意固定 $10^6$ 组**
所有数 $\le 10^{19}$,seed 请用 `unsigned long long`
### 题解:
[solution1](https://www.cnblogs.com/xrlong/p/18284564)
——from xrlong
[solution2](https://www.cnblogs.com/hzoi-wang54321/p/18284251)
——from wang54321