提出 #67786472


ソースコード 拡げる

#include <bits/stdc++.h>

#include <cstdint>
#include <istream>
#include <ostream>

using std::istream, std::ostream;

template <uint32_t base>
struct Montgomery {
	using i32 = int32_t;
	using u32 = uint32_t;
	using u64 = uint64_t;

	static constexpr u32 mod() {
		return base;
	}

	static constexpr u32 np = []() {
		u32 x = base;
		for (int i = 0; i < 4; ++i) {
			x *= 2u - base * x;
		}
		return -x;
	}();
	static constexpr u32 r2 = -(u64)(base) % base;

	static_assert(base < (1u << 30));
	static_assert(base * np + 1 == 0);

	static u32 reduce(u64 x) {
		return (x + (u64)((u32)x * np) * base) >> 32;
	}

	u32 x;
	Montgomery(): x(0) {}
	constexpr Montgomery(long long y): x(y ? reduce((u64)(y % base + base) * r2) : 0) {}

	Montgomery& operator +=(const Montgomery& ot) {
		if ((i32)(x += ot.x - 2 * base) < 0) {
			x += 2 * base;
		}
		return *this;
	}

	Montgomery& operator -=(const Montgomery& ot) {
		if ((i32)(x -= ot.x) < 0) {
			x += 2 * base;
		}
		return *this;
	}

	Montgomery& operator *=(const Montgomery& ot) {
		x = reduce((u64)x * ot.x);
		return *this;
	}

	Montgomery& operator /=(const Montgomery& ot) {
		return *this *= ot.inverse();
	}

	friend Montgomery operator +(Montgomery a, const Montgomery& b) {
		a += b;
		return a;
	}

	friend Montgomery operator -(Montgomery a, const Montgomery& b) {
		a -= b;
		return a;
	}

	friend Montgomery operator *(Montgomery a, const Montgomery& b) {
		a *= b;
		return a;
	}

	friend Montgomery operator /(Montgomery a, const Montgomery& b) {
		a /= b;
		return a;
	}

	Montgomery operator -() const {
		return Montgomery() - *this;
	}

	u32 get() const {
		u32 res = reduce(x);
		return res < base ? res : res - base;
	}

	u32 operator ()() const {
		return get();
	}

	Montgomery inverse() const {
		return pow(base - 2);
	}

	Montgomery inv() const {
		return inverse();
	}

	Montgomery pow(int64_t p) const {
		if (p < 0) {
			return pow(-p).inverse();
		}
		Montgomery res = 1;
		Montgomery a = *this;
		while (p) {
			if (p & 1) {
				res *= a;
			}
			p >>= 1;
			a *= a;
		}
		return res;
	}

	friend istream& operator >>(istream& istr, Montgomery& m) {
		long long x;
		istr >> x;
		m = Montgomery(x);
		return istr;
	}

	friend ostream& operator <<(ostream& ostr, const Montgomery& m) {
		return ostr << m.get();
	}

	bool operator ==(const Montgomery& ot) const {
		return (x >= base ? x - base : x) == (ot.x >= base ? ot.x - base : ot.x);
	}

	bool operator !=(const Montgomery& ot) const {
		return (x >= base ? x - base : x) != (ot.x >= base ? ot.x - base : ot.x);
	}

	explicit operator int64_t() const {
		return x;
	}

	explicit operator bool() const {
		return x;
	}
};


#include <vector>
#include <utility>

using std::vector, std::pair;

pair<vector<int>, vector<int>> sieve(int n) {
	vector<int> erat(n + 1);
	vector<int> primes;
	erat[1] = 1;
	for (int i = 2; i <= n; ++i) {
		if (erat[i] == 0) {
			erat[i] = i;
			primes.push_back(i);
		}
		for (int p : primes) {
			if (p > erat[i] || i * p > n) {
				break;
			}
			erat[i * p] = p;
		}
	}
	return {erat, primes};
}

vector<int> calc_phi(const vector<int>& erat) {
	const int n = erat.size();
	vector<int> phi(n);
	phi[1] = 1;
	for (int i = 2; i < n; ++i) {
		phi[i] = phi[i / erat[i]] * erat[i];
		if (erat[i] != erat[i / erat[i]]) {
			phi[i] -= phi[i / erat[i]];
		}
	}
	return phi;
}

vector<int> calc_mu(const vector<int>& erat) {
	const int n = erat.size();
	vector<int> mu(n);
	mu[1] = 1;
	for (int i = 2; i < n; ++i) {
		mu[i] = (erat[i] == erat[i / erat[i]]) ? 0 : -mu[i / erat[i]];
	}
	return mu;
}

#define all(x) (x).begin(), (x).end()

using namespace std;

inline int nxt() {
	int x;
	cin >> x;
	return x;
}

constexpr int mod = 998244353;
using Mint = Montgomery<mod>;

const int N = 202'222;

void solve() {
	vector<Mint> r(N);
	vector<Mint> ir(N);
	for (int i = 1; i < N; ++i) {
		r[i] = r[i - 1] * 10 + 1;
		ir[i] = r[i].inv();
	}
	const auto erat = sieve(N).first;
	const auto mu = calc_mu(erat);
	vector<Mint> rr(N, 1);
	for (int g = 1; g < N; ++g) {
		for (int dg = 1; dg * g < N; ++dg) {
			if (mu[dg] == 1) {
				rr[g * dg] *= r[g];
			} else if (mu[dg] == -1) {
				rr[g * dg] *= ir[g];
			}
		}
	}
	vector<vector<int>> divs(N);
	for (int i = 1; i < N; ++i) {
		for (int j = 1; i * j < N; ++j) {
			divs[i * j].push_back(i);
		}
	}
	vector<char> present(N);

	int n = nxt();
	Mint ans = 1;
	for (int i = 0; i < n; ++i) {
		int x = nxt();
		if (!present[x]) {
			for (int d : divs[x]) {
				if (!present[d]) {
					present[d] = true;
					ans *= rr[d];
				}
			}
		}
		cout << ans << "\n";
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = 1; // nxt();
	while (t--) {
		solve();
	}

	return 0;
}

提出情報

提出日時
問題 C - Repunits
ユーザ Golovanov399
言語 C++ 20 (gcc 12.2)
得点 900
コード長 4963 Byte
結果 AC
実行時間 159 ms
メモリ 28964 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 900 / 900
結果
AC × 3
AC × 30
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_n_small_00.txt, 01_n_small_01.txt, 01_n_small_02.txt, 01_n_small_03.txt, 01_n_small_04.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt, 02_random_12.txt, 02_random_13.txt, 02_random_14.txt, 03_hcn_00.txt, 03_hcn_01.txt, 03_hcn_02.txt, 03_hcn_03.txt, 03_hcn_04.txt, 04_max_00.txt, 05_min_00.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 111 ms 28924 KiB
00_sample_01.txt AC 107 ms 28788 KiB
00_sample_02.txt AC 107 ms 28800 KiB
01_n_small_00.txt AC 106 ms 28780 KiB
01_n_small_01.txt AC 112 ms 28856 KiB
01_n_small_02.txt AC 109 ms 28784 KiB
01_n_small_03.txt AC 109 ms 28964 KiB
01_n_small_04.txt AC 112 ms 28784 KiB
02_random_00.txt AC 143 ms 28964 KiB
02_random_01.txt AC 152 ms 28888 KiB
02_random_02.txt AC 141 ms 28964 KiB
02_random_03.txt AC 155 ms 28952 KiB
02_random_04.txt AC 150 ms 28956 KiB
02_random_05.txt AC 153 ms 28952 KiB
02_random_06.txt AC 143 ms 28876 KiB
02_random_07.txt AC 150 ms 28816 KiB
02_random_08.txt AC 144 ms 28796 KiB
02_random_09.txt AC 152 ms 28924 KiB
02_random_10.txt AC 140 ms 28848 KiB
02_random_11.txt AC 157 ms 28888 KiB
02_random_12.txt AC 159 ms 28904 KiB
02_random_13.txt AC 158 ms 28892 KiB
02_random_14.txt AC 158 ms 28820 KiB
03_hcn_00.txt AC 136 ms 28880 KiB
03_hcn_01.txt AC 135 ms 28796 KiB
03_hcn_02.txt AC 139 ms 28844 KiB
03_hcn_03.txt AC 135 ms 28744 KiB
03_hcn_04.txt AC 136 ms 28884 KiB
04_max_00.txt AC 132 ms 28900 KiB
05_min_00.txt AC 111 ms 28888 KiB