結果
問題 | No.1760 Setwise Coprime |
ユーザー |
![]() |
提出日時 | 2021-11-20 14:37:50 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 18 ms / 2,000 ms |
コード長 | 1,933 bytes |
コンパイル時間 | 1,511 ms |
コンパイル使用メモリ | 176,220 KB |
実行使用メモリ | 10,240 KB |
最終ジャッジ日時 | 2024-06-11 15:43:54 |
合計ジャッジ時間 | 2,944 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 998244353;const long long R = 249561089; //3/4int main(){int N;cin >> N;vector<bool> prime(N + 1, true);for (int i = 2; i <= N; i++){if (prime[i]){for (int j = i * 2; j <= N; j += i){prime[j] = false;}}}vector<int> mobius(N + 1, 1);for (int i = 2; i <= N; i++){if (prime[i]){for (int j = i; j <= N; j += i){mobius[j] *= -1;}}}for (int i = 2; i * i <= N; i++){for (int j = i * i; j <= N; j += i * i){mobius[j] = 0;}}vector<long long> pow2(N + 1);pow2[0] = 1;for (int i = 0; i < N; i++){pow2[i + 1] = pow2[i] * 2 % MOD;}vector<long long> A(N + 2, 0);for (int i = 1; i <= N; i++){A[i] = mobius[i];}A[N + 1] = 0;for (int i = 1; i <= N; i++){A[N + 1] -= mobius[i];}for (int i = 1; i <= N + 1; i++){if (A[i] < 0){A[i] += MOD;}A[i] *= pow2[N / i];A[i] %= MOD;}vector<long long> powR(N + 1);powR[0] = 1;for (int i = 0; i < N; i++){powR[i + 1] = powR[i] * R % MOD;}vector<long long> C = A;for (int i = 2; i <= N; i++){if (prime[i]){for (int j = 1; j * i <= N + 1; j++){C[j * i] += C[j];C[j * i] %= MOD;}}}for (int i = 1; i <= N + 1; i++){C[i] *= C[i];C[i] %= MOD;}for (int i = 2; i <= N; i++){if (prime[i]){for (int j = (N + 1) / i; j >= 1; j--){C[j * i] -= C[j];C[j * i] += MOD;C[j * i] %= MOD;}}}long long sum = 0;for (int i = 1; i <= N + 1; i++){sum += A[i];}sum %= MOD;sum *= sum;sum %= MOD;for (int i = 1; i <= N; i++){sum += MOD - C[i];sum %= MOD;}long long ans = 0;for (int i = 1; i <= N; i++){ans += C[i] * powR[N / i] % MOD;}ans += sum;ans %= MOD;cout << ans << endl;}