#include<bits/stdc++.h>
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
#define o1 cout<<"YES\n"
#define o0 cout<<"NO\n"
using namespace std;
typedef unsigned long long u64;
const int P = 998244353;
namespace GenHelper
{
unsigned z1, z2, z3, z4, b;
unsigned rand_()
{
b = ((z1 << 6)^z1) >> 13;
z1 = ((z1 & 4294967294U) << 18)^b;
b = ((z2 << 2)^z2) >> 27;
z2 = ((z2 & 4294967288U) << 2)^b;
b = ((z3 << 13)^z3) >> 21;
z3 = ((z3 & 4294967280U) << 7)^b;
b = ((z4 << 3)^z4) >> 12;
z4 = ((z4 & 4294967168U) << 13)^b;
return (z1 ^ z2 ^ z3 ^ z4);
}
}
void srand(unsigned x)
{ using namespace GenHelper;
z1 = x; z2 = (~x) ^ 0x233333333U; z3 = x ^ 0x1234598766U; z4 = (~x) + 51;
}
int read()
{
using namespace GenHelper;
int a = rand_() % 32767;
int b = rand_() % 32767;
return (a + b) % 32767;
}
signed main() {
int n, s, p = 0;
string mod;
cin >> n >> mod >> s;
srand(s);
int i;
if (mod == "2") {
// bitset<50000001> a;
// bool ans = 0, sum = 0;
// For(i, 1, n) {
// a.set(i, read() & 1);
// }
// For(i, 1, n) {
// ans = ans ^ (sum & a[i]);
// sum = sum ^ a[i];
// }
// sum = 0;
// FOR(i, n, 1) {
// ans = ans ^ (sum & a[i]);
// sum = sum ^ a[i];
// }
// For(i, 1, n) {
// ans = ans ^ (a[i] & a[i]);
// }
// cout << ans;
}
else {
vector<int> a(n + 1);
For(i, 1, n) a[i] = read();
if (mod == "18446744073709551616") {
u64 sum, ans = 0;
sum = 0;
For(i, 1, n) {
ans += 1ull * a[i] * sum;
sum += a[i];
}
sum = 0;
FOR(i, n, 1) {
ans += 1ull * a[i] * sum;
sum += a[i];
}
For(i, 1, n) {
ans += 1ull * a[i] * a[i];
}
cout << ans;
}
else if (mod != "998244353") {
for (auto u : mod) p *= 10, p += u - '0';
int sum, ans = 0;
For(i, 1, n) a[i] %= p;
sum = 0;
For(i, 1, n) {
ans += 1ll * a[i] * sum % p;
if (ans >= p) ans -= p;
sum += a[i];
if (sum >= p) sum -= p;
}
sum = 0;
FOR(i, n, 1) {
ans += 1ll * a[i] * sum % p;
if (ans >= p) ans -= p;
sum += a[i];
if (sum >= p) sum -= p;
}
For(i, 1, n) {
ans += 1ll * a[i] * a[i] % p;
if (ans >= p) ans -= p;
}
cout << ans;
}
else {
int sum, ans = 0;
sum = 0;
For(i, 1, n) {
ans += 1ll * a[i] * sum % P;
ans %= P;
sum += a[i];
sum %= P;
}
sum = 0;
FOR(i, n, 1) {
ans += 1ll * a[i] * sum % P;
ans %= P;
sum += a[i];
sum %= P;
}
For(i, 1, n) {
ans += 1ll * a[i] * a[i] % P;
ans %= P;
}
cout << ans << '\n';
}
}
return 0;
}
我把注释代码部分的注释去掉(就是不进行注释),我最后那个 if 内的情况会慢很多(一倍) 400 ms 到 900 ms。但是其它 if 情况的时候应该不会执行这段代码啊,应该注释不注释一样吧。为啥呀。