結果
問題 |
No.3296 81-like number
|
ユーザー |
![]() |
提出日時 | 2025-10-09 17:42:12 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 6 ms / 2,000 ms |
コード長 | 2,893 bytes |
コンパイル時間 | 6,838 ms |
コンパイル使用メモリ | 290,332 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-10-09 17:42:27 |
合計ジャッジ時間 | 5,362 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 15 |
ソースコード
#include <bits/stdc++.h> //#include <atcoder/modint> using namespace std; //using namespace atcoder; using ll = long long; //using mint = modint998244353; struct Erat{ vector<int> spf; vector<bool> prime_table; vector<int> mobius; Erat(int m){ assert(m <= 10000000); spf.resize(m+1, -1); prime_table.resize(m+1, 1); mobius.resize(m+1, 1); prime_table[0] = 0; prime_table[1] = 0; spf[1] = 1; for (int i=2; i<=m; i++){ if (prime_table[i]){ spf[i] = i; mobius[i] = -1; for (int j=i*2; j<=m; j+=i){ prime_table[j] = 0; if (spf[j] == -1) spf[j] = i; if ((j/i) % i == 0) mobius[j] = 0; else mobius[j] = -mobius[j]; } } } } map<int, int> prime_factor(int n) const{ map<int, int> res; while(n != 1){ res[spf[n]]++; n /= spf[n]; } return res; } vector<int> all_factor(int n) const{ vector<int> res={1}; map<int, int> prime = prime_factor(n); for (auto [p, e] : prime){ int x=1, m=res.size(); for (int j=0; j<e; j++){ x *= p; for (int k=0; k<m; k++) res.push_back(res[k] * x); } } sort(res.begin(), res.end()); return res; } inline bool is_prime(int n) const{return prime_table[n];} template<typename T> vector<T> fast_zeta(const vector<T> &vec) const{ int n = vec.size(); vector<T> res=vec; for (int i=2; i<n; i++){ if (!is_prime(i)) continue; for (int j=(n-1)/i; j>=1; j--) res[j] += res[j*i]; } return res; } template<typename T> vector<T> fast_mobius(const vector<T> &vec) const{ int n = vec.size(); vector<T> res=vec; for (int i=2; i<n; i++){ if (!is_prime(i)) continue; for (int j=1; i*j<n; j++) res[j] -= res[j*i]; } return res; } template<typename T> vector<T> gcd_convolution(const vector<T> & _f, const vector<T> & _g){ vector<T> f=_f, g=_g, h; int n = max(f.size(), g.size()); f.resize(n); g.resize(n); h.resize(n); f = fast_zeta(f); g = fast_zeta(g); for (int i=1; i<n; i++) h[i] = f[i] * g[i]; return fast_mobius(h); } }; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll ans=0, N; cin >> N; Erat erat(100000); for (int p=1; p<=100000; p++){ if (erat.is_prime(p)){ ll pw=(ll)p*p; while(pw<=N){ ans += pw; pw *= p; } } } cout << ans << endl; return 0; }