作用
购买一台新电脑或走进一间新机房后,这个小工具可以帮您快速了解电脑的性能。
注意:本工具仅供娱乐,不能作为电脑性能的参考依据。
原理
本工具会先生成一个长度为 \(N\) 的 int 类型随机序列 \(a\),再生成一个长度为 \(N\) 的排列 \(b\),然后定义 int 类型变量 \(\text{sum}=0\)。接下来,工具会重复 \(M\) 次以下操作:
- 求 \(\sum\limits_{i=1}\limits^n a_{b_i} \bmod 998244353\);
- 将上一步的结果累加到 \(\text{sum}\) 并 \(\bmod 998244353\)。
用法
输出格式为:
Initialization completed, testing...
Counting: 5e+08 # N*M 的值,即加法运算的次数,默认为 5e8
Random number: 395659868 # 求出的 sum 的值,可以忽略这一项
Running for 9.428 second(s). # 程序在求和阶段的运行时长,保留三位小数
代码
#include <cstdio>
#include <random>
const int N = 100000000, NN = N + 5, M = 5, mod = 998244353;
int a[NN], b[NN], sum = 0;
std::mt19937_64 rng(mod);
#define randInt(l, r) ( std::uniform_int_distribution<int>((l),(r))(rng) )
int main() {srand(time(NULL));for (int i = 1; i <= N; i++) a[i] = rand();for (int i = 1; i <= N; i++) b[i] = i;for (int i = N; i >= 1; i--) std::swap(b[i], b[randInt(1, i)]);printf("Initialization completed, testing...\n");clock_t beg = clock();for (int j = 1; j <= M; j++) for (int i = 1; i <= N; i++) sum = (sum + a[b[i]]) % mod;clock_t end = clock();double tim = static_cast<double>(end - beg) / CLOCKS_PER_SEC;printf("Counting: %g\nRandom number: %d\n", (float)((long long)N * M), sum);printf("Running for %.3lf second(s).\n", tim);return 0;
}
建议的编译选项:-std=c++14 -O2 -static