結果

問題 No.2829 GCD Divination
ユーザー Harui
提出日時 2024-08-02 23:17:27
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 3,625 bytes
コンパイル時間 1,459 ms
コンパイル使用メモリ 109,372 KB
実行使用メモリ 314,768 KB
最終ジャッジ日時 2024-08-02 23:17:56
合計ジャッジ時間 28,323 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 5 WA * 27 TLE * 3
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#line 1 "playground_A.cpp"
#include <iostream>
#include <iomanip>
#include <cassert>
#include <map>
using namespace std;
using ll = long long;
template<class T> inline bool chmax(T& a, const T& b) {if (a<b) {a=b; return true;} return false;}
template<class T> inline bool chmin(T& a, const T& b) {if (b<a) {a=b; return true;} return false;}
const int INTINF = 1000001000;
const int INTMAX = 2147483647;
const ll LLMAX = 9223372036854775807;
const ll LLINF = 1000000000000000000;
#line 1 "/home/samejima/CompetitiveProgramming/library/convolution/multiple-zeta-moebius-transform.hpp"
#include <vector>
namespace multiple {
// g_n = \Sigma_{n|m} f_m g
// n|mm%n==0
// O(N log N) (調)
// O(Nlog(log(N)))log
template <typename T, T (*op)(T, T)>
std::vector<T> zeta_transform_naive(const std::vector<T>& f) {
int N = f.size() - 1;
std::vector<T> g = f;
for (int i = 1; i <= N; i++) {
for (int j = 2 * i; j <= N; j += i) {
g[i] = op(g[i], f[j]);
}
}
return g;
}
//
// f_n = \Sigma_{n|m} g_m g
// O(N log N) (調)
template <typename T, T(*invop)(T, T)>
std::vector<T> moebius_transform_naive(const std::vector<T>& f) {
int N = f.size() - 1;
std::vector<T> g = f;
for (int i = N; i >= 1; i--) {
for (int j = 2 * i; j <= N; j += i) {
g[i] = invop(g[i], g[j]);
}
}
return g;
}
template <typename I, typename T, T(*op)(T, T)>
std::map<I, T> zeta_transform(const std::map<I, T>& mp) {
std::map<I, T> ret = mp;
for (std::pair<I, T> pit : ret) {
for (auto p2itr = ret.rbegin(); (*p2itr).first != pit.first; p2itr++) {
if ((*p2itr).first % pit.first == 0) {
ret[pit.first] = op(ret[pit.first], (*p2itr).second);
}
}
}
return ret;
}
template <typename I, typename T, T (*invop)(T, T)>
std::map<I, T> moebius_transform(const std::map<I, T>& mp) {
std::map<I, T> ret = mp;
for (auto p1itr = ret.rbegin(); p1itr != ret.rend(); p1itr++) {
for (auto p2itr = ret.rbegin(); p2itr != p1itr; p2itr++) {
if ((*p2itr).first % (*p1itr).first == 0) {
(*p1itr).second = invop((*p1itr).second, (*p2itr).second);
}
}
}
return ret;
}
} // namespace multiple
#line 15 "playground_A.cpp"
ll llpow(ll a, ll power) {
ll ret =1;
ll base =a;
while (power > 0) {
if (power & 1) {
ret *= base;
}
base *= base;
power >>= 1;
}
return ret;
}
ll op(ll a, ll b) {return a+b;}
ll invop(ll a, ll b) {return a-b;}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll N; cin >> N;
map<ll,double> memo;
memo[1] = 0.0;
auto solve = [&memo] (auto self, ll n) -> double {
if (memo.contains(n)) return memo.at(n);
double divsum = 0;
vector<ll> g = vector<ll>(n+1);
for (int i=1; i<=n; i++) g[i] = n/i;
vector<ll>g2 = multiple::moebius_transform_naive<ll,invop>(g);
for (int d=2; d*d <= n; d++) {
if (n % d == 0) {
divsum += self(self, d) * g2[d];
if (d != n/d) {
divsum += self(self, n/d) * g2[n/d];
}
}
}
double ret = double(n) / double(n-1) + divsum / double(n-1);
memo[n] = ret;
return ret;
};
cout << fixed << setprecision(10);
cout << solve(solve,N) << endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0