|
| 1 | +#include <bits/stdc++.h> |
| 2 | +using namespace std; |
| 3 | + |
| 4 | +#define ms(s, n) memset(s, n, sizeof(s)) |
| 5 | +#define FOR(i, a, b) for (int i = (a); i < (b); i++) |
| 6 | +#define FORd(i, a, b) for (int i = (a) - 1; i >= (b); i--) |
| 7 | +#define FORall(it, a) for (__typeof((a).begin()) it = (a).begin(); it != (a).end(); it++) |
| 8 | +#define sz(a) int((a).size()) |
| 9 | +#define present(t, x) (t.find(x) != t.end()) |
| 10 | +#define all(a) (a).begin(), (a).end() |
| 11 | +#define uni(a) (a).erase(unique(all(a)), (a).end()) |
| 12 | +#define pb push_back |
| 13 | +#define pf push_front |
| 14 | +#define mp make_pair |
| 15 | +#define fi first |
| 16 | +#define se second |
| 17 | +#define prec(n) fixed<<setprecision(n) |
| 18 | +#define bit(n, i) (((n) >> (i)) & 1) |
| 19 | +#define bitcount(n) __builtin_popcountll(n) |
| 20 | +typedef long long ll; |
| 21 | +typedef unsigned long long ull; |
| 22 | +typedef long double ld; |
| 23 | +typedef pair<int, int> pi; |
| 24 | +typedef vector<int> vi; |
| 25 | +typedef vector<pi> vii; |
| 26 | +const int MOD = (int) 1e9 + 7; |
| 27 | +const int MOD2 = (int) 1e8 + 7; |
| 28 | +const int INF = (int) 1e9; |
| 29 | +const ll LINF = (ll) 1e18; |
| 30 | +const ld PI = acos((ld) -1); |
| 31 | +const ld EPS = 1e-9; |
| 32 | +inline ll gcd(ll a, ll b) {ll r; while (b) {r = a % b; a = b; b = r;} return a;} |
| 33 | +inline ll lcm(ll a, ll b) {return a / gcd(a, b) * b;} |
| 34 | +inline ll fpow(ll n, ll k, int p = MOD) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n % p; n = n * n % p;} return r;} |
| 35 | +template<class T> inline int chkmin(T& a, const T& val) {return val < a ? a = val, 1 : 0;} |
| 36 | +template<class T> inline int chkmax(T& a, const T& val) {return a < val ? a = val, 1 : 0;} |
| 37 | +inline ll isqrt(ll k) {ll r = sqrt(k) + 1; while (r * r > k) r--; return r;} |
| 38 | +inline ll icbrt(ll k) {ll r = cbrt(k) + 1; while (r * r * r > k) r--; return r;} |
| 39 | +inline void addmod(int& a, int val, int p = MOD) {if ((a = (a + val)) >= p) a -= p;} |
| 40 | +inline void submod(int& a, int val, int p = MOD) {if ((a = (a - val)) < 0) a += p;} |
| 41 | +inline int mult(int a, int b, int p = MOD) {return (ll) a * b % p;} |
| 42 | +inline int inv(int a, int p = MOD) {return fpow(a, p - 2, p);} |
| 43 | +inline int sign(ld x) {return x < -EPS ? -1 : x > +EPS;} |
| 44 | +inline int sign(ld x, ld y) {return sign(x - y);} |
| 45 | +#define db(x) cerr << #x << " = " << (x) << ", "; |
| 46 | +#define endln cerr << "\n"; |
| 47 | + |
| 48 | +//Given a number N, find sum of all GCDs that can be formed by selecting all the pairs from 1 to N. |
| 49 | + |
| 50 | +const int N = 12; |
| 51 | +int phi[N + 1]; |
| 52 | +int prime[N + 1]; |
| 53 | +long long G[N + 1]; |
| 54 | + |
| 55 | +int main() { |
| 56 | + // Compute phi[n] |
| 57 | + for (int p = 1; p <= N; ++ p) phi[p] = p; |
| 58 | + for (int p = 2; p <= N; ++ p) |
| 59 | + if (phi[p] == p) |
| 60 | + for (int n = p; n <= N; n += p) |
| 61 | + phi[n] = phi[n]/p*(p-1); |
| 62 | + |
| 63 | + // Compute prime[n] -> Largest prime that divides n |
| 64 | + for (int p = 1; p <= N; ++ p) prime[p] = 0; |
| 65 | + for (int p = 2; p <= N; ++ p) |
| 66 | + if (prime[p] == 0) |
| 67 | + for (int n = p; n <= N; n += p) prime[n] = max(prime[n], p); |
| 68 | + |
| 69 | + G[1] = 1; |
| 70 | + for (int n = 2; n <= N; ++ n) { |
| 71 | + int p = 1; |
| 72 | + int k = 0; |
| 73 | + while (p <= n/prime[n] && n % (p * prime[n]) == 0) { |
| 74 | + p *= prime[n]; |
| 75 | + ++ k; |
| 76 | + } |
| 77 | + G[n] = ((k+1)*p - k*p/prime[n]) * G[n/p]; |
| 78 | + } |
| 79 | + |
| 80 | + G[1] = G[1] - 1; |
| 81 | + for (int n = 2; n <= N; ++ n) G[n] += G[n-1] - n; |
| 82 | + cout << G[N] << endl; |
| 83 | +} |
| 84 | + |
| 85 | + |
0 commit comments