一个神奇的代码块问题
  • 板块学术版
  • 楼主awdec
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/7 21:45
  • 上次更新2024/8/7 22:01:06
查看原帖
一个神奇的代码块问题
285856
awdec楼主2024/8/7 21:45
#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 情况的时候应该不会执行这段代码啊,应该注释不注释一样吧。为啥呀。

2024/8/7 21:45
加载中...