萌新样例 2 没过求调
查看原帖
萌新样例 2 没过求调
432948
definieren楼主2024/7/21 11:00

万分感谢。

#include <bits/stdc++.h>

#define fir first
#define sec second

using namespace std;

using ll = long long;

bool Mbe;
constexpr int MOD = 998244353;
template<typename T> T add(T a, T b, T p = MOD) { return (a + b >= p) ? (a + b - p) : (a + b); }
template<typename T> T del(T a, T b, T p = MOD) { return (a - b < 0) ? (a - b + p) : (a - b); }
template<typename T> T mul(T a, T b, T p = MOD) { return 1ll * a * b % p; }
template<typename T> T cadd(T &a, T b, T p = MOD) { return a = add(a, b, p); }
template<typename T> T cdel(T &a, T b, T p = MOD) { return a = del(a, b, p); }
template<typename T> T cmul(T &a, T b, T p = MOD) { return a = mul(a, b, p); }
template<typename T> bool cmax(T &a, T b) { return a < b ? a = b, true : false; }
template<typename T> bool cmin(T &a, T b) { return a > b ? a = b, true : false; }

namespace FastIO {
	constexpr int LEN = 1 << 20;
	char in[LEN + 1], out[LEN + 1];
	char *pin = in, *pout = out, *ein = in, *eout = out + LEN;

	char gc() { return pin == ein && (ein = (pin = in) + fread(in, 1, LEN, stdin), ein == in) ? EOF : *pin ++; }
	void pc(char c) { pout == eout && (fwrite(out, 1, LEN, stdout), pout = out); (*pout ++) = c; return; }
	void Flush() { fwrite(out, 1, pout - out, stdout); pout = out; }

	template<typename T> T Read() {
		T x = 0; int f = 1; char ch = gc();
		while (ch < '0' || ch > '9') f = (ch == '-' ? (~f + 1) : f), ch = gc();
		while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
		return x * f;
	}
	template<typename T> void Write(T x, char c) {
		static char stk[40]; int tp = 0;
		if (x < 0) pc('-'), x = ~x + 1;
		do stk[tp++] = x % 10 + 48, x /= 10; while (x);
		while (tp --) pc(stk[tp]); pc(c); return;
	}
	void Read(char *s) {
		char ch = gc();
		while (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
			(ch >= '0' && ch <= '9'))) ch = gc();
		while ((ch != EOF) && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
			(ch >= '0' && ch <= '9'))) *s = ch, s ++, ch = gc();
		*s = '\0'; return;
	}
	void Write(char *s) {
		while (*s != '\0') pc(*s), s ++; return;
	}
	void Puts(char *s) {
		Write(s), pc('\n'); return;
	}
}

#define getchar FastIO::gc
#define putchar FastIO::pc
#define Flush FastIO::Flush
#define Read FastIO::Read
#define Write FastIO::Write
#define Puts FastIO::Puts

constexpr int N = 5e4 + 5, B = 1 << 15, M = 1 << 15 | 10;
int n, m, c, p, a[30][N], pw1[30][M], pw2[30][M], lim;
vector<int> phi;

struct Node {
	int mn, sum;
} sgt[N << 2];

int Get_Phi(int x) {
	int ret = x;
	for (int i = 2; i * i <= x; i ++)
		if (x % i == 0) {
			ret = ret / i * (i - 1);
			while (x % i == 0) x /= i;
		}
	if (x ^ 1) ret = ret / x * (x - 1);
	phi.emplace_back(ret); return ret;
}
int qpow(int x, int dep) {
	int mod = phi[dep]; ll ret = 1ll * pw2[dep][x >> 14] * pw1[dep][x & B - 1];
	return (!dep || ret < mod) ? ret % mod : ret % mod + mod;
}
void Init() {
	int tmp = p; phi.emplace_back(p); while ((tmp = Get_Phi(tmp)) != 1);
	for (int _ = 0; _ < phi.size(); _ ++) {
		int mod = phi[_]; ll tmp;
		for (int i = pw1[_][0] = 1; i <= B; i ++)
			tmp = 1ll * c * pw1[_][i - 1],
			pw1[_][i] = tmp < mod ? tmp : tmp % mod + mod;
		for (int i = pw2[_][0] = 1; i <= B; i ++)
			tmp = 1ll * pw1[_][B] * pw2[_][i - 1],
			pw2[_][i] = tmp < mod ? tmp : tmp % mod + mod;
	}
	for (int i = 1; i < phi.size(); i ++)
		for (int j = 1; j <= n; j ++) {
			a[i][j] = a[0][j] >= phi[i] ? a[0][j] % phi[i] + phi[i] : a[0][j];
			for (int k = i - 1; k >= 0; k --)
				a[i][j] = qpow(a[i][j], k);
		}
	lim = phi.size() - 1; return;
}

void Push_Up(int p) {
	sgt[p].sum = add(sgt[p << 1].sum, sgt[p << 1 | 1].sum, ::p);
	sgt[p].mn = min(sgt[p << 1].mn, sgt[p << 1 | 1].mn);
	return;
}
void Build(int p = 1, int L = 1, int R = n) {
	if (L == R) return sgt[p].sum = a[0][L], void();
	int Mid = L + R >> 1; Build(p << 1, L, Mid);
	Build(p << 1 | 1, Mid + 1, R); Push_Up(p); return;
}
void Update(int l, int r, int p = 1, int L = 1, int R = n) {
	if (sgt[p].mn >= lim) return;
	if (L == R) {
		sgt[p].mn ++; sgt[p].sum = a[sgt[p].mn][L];
//		cout << L << ' ' << a[sgt[p].mn][L] << endl;
		return;
	}
	int Mid = L + R >> 1;
	if (l <= Mid) Update(l, r, p << 1, L, Mid);
	if (Mid < r) Update(l, r, p << 1 | 1, Mid + 1, R);
	Push_Up(p); return;
}
int Query(int l, int r, int p = 1, int L = 1, int R = n) {
//	cout << p << ' ' << L << ' ' << R << ' ' << sgt[p].sum << endl;
	if (l <= L && R <= r) return sgt[p].sum;
	int Mid = L + R >> 1;
	if (r <= Mid) return Query(l, r, p << 1, L, Mid);
	if (Mid < l) return Query(l, r, p << 1 | 1, Mid + 1, R);
	return add(Query(l, r, p << 1, L, Mid), Query(l, r, p << 1 | 1, Mid + 1, R), ::p);
}

void slv() {
	n = Read<int>(), m = Read<int>(), p = Read<int>(), c = Read<int>();
	for (int i = 1; i <= n; i ++) a[0][i] = Read<int>();
	Build(); Init();
//	for (auto i : phi) cout << i << ' '; cout << endl;
//	for (int i = 0; i <= lim; i ++, cout << endl)
//		for (int j = 0; j <= B; j ++)
//			cout << pw1[i][j] << ' '; cout << endl;
//	for (int i = 0; i <= lim; i ++, cout << endl)
//		for (int j = 0; j <= B; j ++)
//			cout << pw2[i][j] << ' '; 
//	for (auto i : phi) cout << i << ' '; cout << endl;
	for (int i = 0; i < phi.size(); i ++, cout << endl)
		for (int j = 1; j <= n; j ++) cout << a[i][j] << ' ';
	while (m --) {
		int opt = Read<int>(), l = Read<int>(), r = Read<int>();
		if (!opt) Update(l, r); else Write(Query(l, r), '\n');
	}
	return;
}
void clr() {

	return;
}

bool Med;
int main() {
#ifdef LOCAL
	freopen("!in.in", "r", stdin);
	freopen("!out.out", "w", stdout);
	fprintf(stderr, "%.3lf Mb\n", fabs((&Mbe - &Med) / 1048576.0));
#endif
	int T = 1;
//	int T = Read<int>();
	while (T --) slv(), clr();
	Flush();
#ifdef LOCAL
	fprintf(stderr, "%d ms\n", (int)clock());
#endif
	return 0;
}
2024/7/21 11:00
加载中...