莫比乌斯,欧拉函数练习集合(完结)
解方程
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e7 + 10, mod = 998244353; ll prime[N], minnp[N], f[N], cnt, p, q, n; bool st[N]; ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } void init() { f[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; f[i] = (quick_pow(i, q) - quick_pow(i, p) + mod) % mod; minnp[i] = 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { minnp[i * prime[j]] = minnp[i] + 1; f[i * prime[j]] = f[i / quick_pow(prime[j], minnp[i])] * (quick_pow(prime[j], q * (minnp[i * prime[j]])) - quick_pow(prime[j], p + minnp[i] * q) + mod) % mod; break; } minnp[i * prime[j]] = 1; f[i * prime[j]] = f[i] * f[prime[j]] % mod; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n >> p >> q; init(); ll ans = 0; for(int i = 1; i <= n; i++) { ans ^= f[i]; } cout << ans << "\n"; return 0; }
求和
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10; int prime[N], phi[N], cnt, n, mod, inv6; bool st[N]; int quick_pow(int a, int n) { int ans = 1; while(n) { if(n & 1) ans = 1ll * ans * a % mod; a = 1ll * a * a % mod; n >>= 1; } return ans; } void init() { phi[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; phi[i] = i - 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } phi[i * prime[j]] = phi[i] * (prime[j] - 1); } } for(int i = 1; i < N; i++) { phi[i] = (phi[i] + phi[i - 1]) % mod; } } unordered_map<int, int> ans_s; int Djs_phi(int n) { if(n < N) return phi[n]; if(ans_s.count(n)) return ans_s[n]; int ans = 1ll * n * (n + 1) / 2 % mod; for(int l = 2, r; l <= n; l = r + 1) { r = n / (n / l); ans = (ans - 1ll * (r - l + 1) * Djs_phi(n / l) % mod + mod) % mod; } return ans_s[n] = ans; } int calc(int n) { return 1ll * n * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); scanf("%d %d", &n, &mod); init(); inv6 = quick_pow(6, mod - 2); int ans = 0; for(int l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans = (ans + 1ll * (Djs_phi(r) - Djs_phi(l - 1)) * calc(n / l) % mod + mod) % mod; } printf("%d\n", ans); return 0; }
算术
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int prime[N], mu[N], g[N], f1[N], f2[N], n, m, cnt; bool st[N]; void init() { mu[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; mu[i] = -1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { g[j] += mu[i] * mu[j / i]; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { for(int j = i; j <= n; j += i) { f1[i] += mu[j]; } } for(int i = 1; i <= m; i++) { for(int j = i; j <= m; j += i) { f2[i] += mu[j]; } } int ans = 0; for(int i = 1; i <= n; i++) { ans += f1[i] * f2[i] * g[i]; } printf("%d\n", ans); for(int i = 1; i <= n; i++) { f1[i] = 0; } for(int i = 1; i <= m; i++) { f2[i] = 0; } } return 0; }
Mophues
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; const int N = 5e5 + 10; int prime[N], mu[N], cnt; bool st[N]; struct F { int f, id; bool operator < (const F &t) const { return f < t.f; } }a[N]; void init() { a[1].id = mu[1] = 1, a[1].f = 0; for(int i = 2; i < N; i++) { a[i].id = i; if(!st[i]) { prime[++cnt] = i; mu[i] = -1; a[i].f = 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; a[i * prime[j]].f = a[i].f + 1; if(i % prime[j] == 0) { break; } mu[i * prime[j]] = -mu[i]; } } } struct Ask { int n, m, p, id; bool operator < (const Ask &t) const { return p < t.p; } }ask[N]; int ans[N], tree[N]; int lowbit(int x) { return x & (-x); } void update(int x, int value) { while(x < N) { tree[x] += value; x += lowbit(x); } } int query(int x) { int ans = 0; while(x) { ans += tree[x]; x -= lowbit(x); } return ans; } signed main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%lld", &T); for(int i = 1; i <= T; i++) { scanf("%lld %lld %lld", &ask[i].n, &ask[i].m, &ask[i].p); ask[i].id = i; if(ask[i].n > ask[i].m) { swap(ask[i].n, ask[i].m); } } sort(a + 1, a + N); sort(ask + 1, ask + 1 + T); int now = 1; for(int i = 1; i <= T; i++) { while(now < N && a[now].f <= ask[i].p) { for(int d = a[now].id; d < N; d += a[now].id) { update(d, mu[d / a[now].id]); } now++; } int res = 0; for(int l = 1, r; l <= ask[i].n; l = r + 1) { r = min(ask[i].n / (ask[i].n / l), ask[i].m / (ask[i].m / l)); res += (ask[i].n / l) * (ask[i].m / l) * (query(r) - query(l - 1)); } ans[ask[i].id] = res; } for(int i = 1; i <= T; i++) { printf("%lld\n", ans[i]); } return 0; }
GuGuFishtion(???)
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e6 + 10; int prime[N], phi[N], mu[N], inv[N], n, m, mod, cnt; ll sum[N]; bool st[N]; ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } void init() { memset(st, 0, sizeof st); cnt = 0; mu[1] = phi[1] = inv[1] = 1; for(int i = 2; i < N; i++) { inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; if(!st[i]) { prime[++cnt] = i; mu[i] = -1; phi[i] = i - 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; mu[i * prime[j]] = 0; break; } phi[i * prime[j]] = phi[i] * (prime[j] - 1); mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { mu[i] = (mu[i - 1] + mu[i] + mod) % mod; sum[i] = (sum[i - 1] + 1ll * i * inv[phi[i]] % mod) % mod; } } ll calc(int n, int m) { if(n > m) swap(n, m); ll ans = 0; for(int l = 1, r; l <= n; l = r + 1) { r = min(n / (n / l), m / (m / l)); ans = (ans + 1ll * (mu[r] - mu[l - 1]) * (n / l) % mod * (m / l) % mod + mod) % mod; } return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; scanf("%d", &T); while(T--) { scanf("%d %d %d", &n, &m, &mod); init(); ll ans = 0; if(n > m) swap(n, m); for(int l = 1, r; l <= n; l = r + 1) { r = min(n / (n / l), m / (m / l)); ans = (ans + 1ll * (sum[r] - sum[l - 1]) * calc(n / l, m / l) % mod + mod) % mod; } printf("%lld\n", ans); } return 0; }
The Boss on Mars
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10, mod = 1e9 + 7; int prime[N], cnt; bool st[N]; void init() { for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } } } } int mu(int n) { int sum = 0; for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= n; i++) { if(n % prime[i] == 0) { n /= prime[i]; sum++; if(n % prime[i] == 0) { return 0; } } } if(n != 1) sum++; return sum & 1 ? -1 : 1; } ll calc1(ll n) { ll ans = ans = (1ll * 6 * n % mod * n % mod * n % mod * n % mod * n % mod + 1ll * 15 * n % mod * n % mod * n % mod * n % mod + 1ll * 10 * n % mod * n % mod * n % mod - n + mod) % mod; ans = ans * 233333335 % mod; return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; init(); scanf("%d", &T); while(T--) { int n; scanf("%d", &n); ll ans = 0; for(int i = 1; 1ll * i * i <= n; i++) { if(n % i == 0) { int temp = mu(i); if(temp) { ans = (ans + 1ll * temp * i % mod * i % mod * i % mod * i % mod * calc1(n / i) % mod + mod) % mod; } temp = mu(n / i); if(i * i != n && temp) { ans = (ans + 1ll * temp * (n / i) % mod * (n / i) % mod * (n / i) % mod * (n / i) % mod % mod * calc1(i) % mod + mod) % mod; } } } printf("%lld\n", ans); } return 0; }
Spare Tire
乱搞后得到一个结论。
$$
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10, mod = 1e9 + 7, inv6 = (mod + 1) / 6; int prime[N], fac[N], tot, cnt, n, m; bool st[N]; void init() { for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } } } } ll ans = 0; ll calc1(ll n) { return n * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod; } ll calc2(ll n) { return n * (n + 1) / 2 % mod; } void dfs(int sum, int num, int pos) { if(pos > tot) { ll temp = num & 1 ? -1 : 1; ans = ans + temp * sum * sum % mod * calc1(n / sum) % mod + temp * sum * calc2(n / sum) % mod; ans = (ans % mod + mod) % mod; return ; } dfs(sum, num, pos + 1); dfs(sum * fac[pos], num + 1, pos + 1); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); while(scanf("%d %d", &n, &m) != EOF) { tot = 0; for(int i = 1; 1ll * prime[i] * prime[i] <= m; i++) { if(m % prime[i] == 0) { fac[++tot] = prime[i]; while(m % prime[i] == 0) { m /= prime[i]; } } } if(m != 1) { fac[++tot] = m; } ans = 0; dfs(1, 0, 1); printf("%lld\n", ans); } return 0; }
整数对
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10; int prime[N], mu[N], cnt, n, m, p; bool st[N]; vector<int> fac[N]; void init() { mu[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; mu[i] = -1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { fac[j].push_back(i); } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%d", &T); while(T--) { scanf("%d %d %d", &n, &m, &p); ll ans = 0; for(auto d : fac[p]) { ll ans1 = 0; for(auto x : fac[p / d]) { ans1 += mu[x] * (n / x / d); } for(auto k : fac[p]) { ll ans2 = 0; if(1ll * k * d % p) continue; for(auto y : fac[p / k]) { ans2 += mu[y] * (m / y / k); } ans += ans1 * ans2; } } printf("%lld\n", ans); } return 0; }
gcd
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 1e9 + 7; int prime[N], phi[N], cnt; ll sum[N]; bool st[N]; void init() { phi[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; phi[i] = i - 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } phi[i * prime[j]] = phi[i] * (prime[j] - 1); } } for(int i = 1; i < N; i++) { phi[i] = (phi[i - 1] + phi[i]) % mod; } } ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } ll inv(ll x) { return quick_pow(x, mod - 2); } ll calc(ll x, int l, int r) { if(x == 1) return 0; return (quick_pow(x, l) * inv(x - 1) % mod * (quick_pow(x, r - l + 1) - 1) % mod - (r - l + 1) + mod) % mod; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; init(); scanf("%d", &T); while(T--) { ll x, n, ans = 0; scanf("%lld %lld", &x, &n); for(ll l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans = (ans + calc(x, l, r) * (2ll * phi[n / l] - 1) % mod) % mod; } printf("%lld\n", ans); } return 0; }
Clarke and math
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10, mod = 1e9 + 7; int n, k; struct matrix { ll a[N]; void init() { for(int i = 1; i <= n; i++) { a[i] = 0; } } void print() { for(int i = 1; i <= n; i++) { printf("%d%c", a[i], i == n ? '\n' : ' '); } } }a, ans, I; matrix operator * (const matrix & a, const matrix & b) { matrix ans; ans.init(); for(int i = 1; i <= n; i++){ for(int j = i; j <= n; j += i) { ans.a[j] = (ans.a[j] + a.a[i] * b.a[j / i] % mod) % mod; } } return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &k); for(int i = 1; i <= n; i++) { scanf("%d", &a.a[i]); I.a[i] = 1; } ans.init(); ans.a[1] = 1; while(k) { if(k & 1) ans = ans * I; I = I * I; k >>= 1; } ans = ans * a; ans.print(); } return 0; }
Code
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e4 + 10, mod = 1e4 + 7; int prime[N], mu[N], num[N], cnt, n; ll g[N], f[N]; bool st[N]; void init() { mu[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; mu[i] = -1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = i; j <= N; j += i) { f[j] = (f[j] + (1ll * i * i - i) * mu[j / i] % mod + mod) % mod; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); while(scanf("%d", &n) != EOF) { memset(g, 0, sizeof g); memset(num, 0, sizeof num); for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); num[x]++; } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { g[i] = (g[i] + num[j]) % mod; } } ll ans = 0; for(int i = 1; i < N; i++) { ans =( ans + g[i] * g[i] % mod * f[i]) % mod; } printf("%lld\n", ans); } return 0; }
AT5200 [AGC038C] LCMs
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 998244353; ll sum[N], c[N], n, m, all; bool st[N]; int prime[N], mu[N], cnt; ll quick_pow(ll a, ll n, ll mod) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; n >>= 1; a = a * a % mod; } return ans; } void init() { mu[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[cnt++] = i; mu[i] = -1; } for(int j = 0; j < cnt && i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) break; mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { sum[j] = (sum[j] + i * mu[i] % mod + mod) % mod; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); scanf("%lld", &n), m = 0; for(int i = 1; i <= n; i++) { ll x; scanf("%lld", &x); all = (all + x) % mod; m = max(x, m); c[x]++; } ll ans = 0; for(ll t = 1; t <= m; t++) { ll res = 0; for(ll i = 1; i <= m / t; i++) { res = (res + 1ll * i * c[i * t] % mod) % mod; } ans = (ans + t * res % mod * res % mod * sum[t] % mod) % mod; } printf("%lld\n", ((ans - all) * quick_pow(2, mod - 2, mod) % mod + mod) % mod); return 0; }
Dirichlet k -th root
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10, mod = 998244353; int n, k; ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } ll inv(int x) { return quick_pow(x, mod - 2); } struct matrix { ll a[N]; void init() { memset(a, 0, sizeof a); } matrix operator * (const matrix &t) const { matrix ans; ans.init(); for(int i = 1; i <= n; i++) { for(int j = i; j <= n; j += i) { ans.a[j] = (ans.a[j] + a[i] * t.a[j / i] % mod) % mod; } } return ans; } }a, ans; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); scanf("%d %d", &n, &k); k = inv(k); for(int i = 1; i <= n; i++) { scanf("%lld", &a.a[i]); } ans.a[1] = 1; while(k) { if(k & 1) ans = ans * a; a = a * a; k >>= 1; } for(int i = 1; i <= n; i++) { printf("%lld%c", ans.a[i], i == n ? '\n' : ' '); } return 0; }
GCD of Divisors
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 4e7 + 10; ll prime[N], phi[N], cnt; bool st[N]; void init() { phi[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; phi[i] = i - 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } phi[i * prime[j]] = phi[i] * (prime[j] - 1); } } } ll calc(ll n) { ll ans = 0; for(ll l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans += (r - l + 1) * (n / l); } return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); ll n, ans = 0; scanf("%lld", &n); for(int i = 1; 1ll * i * i <= n; i++) { ans += phi[i] * calc(n / i / i); } cout << ans << "\n"; return 0; }
Absolute Math
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e7 + 10, mod = 1e9 + 7, inv2 = mod + 1 >> 1; int prime[N], sum[N], g[N], f[N], cnt; bool st[N]; void init() { f[1] = g[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; f[i] = 2; g[i] = mod - inv2; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { f[i * prime[j]] = f[i]; break; } f[i * prime[j]] = f[i] * 2; g[i * prime[j]] = 1ll * g[i] * g[prime[j]] % mod; } } for(int i = 1; i < N; i++) { sum[i] = (f[i] + sum[i - 1]) % mod; } } ll solve(int m, int n) { if(m == 0) return 0; if(m == 1) return f[n]; if(n == 1) return sum[m]; ll ans = 0; //发现m <= 20的时候是较优的…… if(m <= 20 && 1ll * n * m < N) { for(int i=1;i<=m;i++) ans = (ans + f[i * n]) % mod; return ans; } for(int i = 1; 1ll * i * i <= n; i++) { if(n % i == 0){ if(g[i]){ ans = (ans + solve(m / i, i) * g[i] % mod) % mod; } if(i * i !=n && g[n / i]){ ans = (ans + solve(m / (n / i), n / i)*g[n / i]) % mod; } } } return ans * f[n] % mod; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%d", &T); while(T--) { int n, m; scanf("%d %d", &n, &m); printf("%lld\n", solve(m, n)); } return 0; } /* 杭电的测评机比自己的老年机跑的还慢…… */
Counting Divisors
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 998244353; int prime[N], cnt; ll a[N], num[N], l, r, k; bool st[N]; void init() { for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%d", &T); while(T--) { scanf("%lld %lld %lld", &l, &r, &k); for(int i = 0; i <= r - l; i++) a[i] = l + i, num[i] = 1; for(int i = 1; 1ll * prime[i] * prime[i] <= r; i++) { ll st = l / prime[i] * prime[i]; if(st < l) st += prime[i]; for(ll j = st; j <= r; j += prime[i]) { ll res = 0; while(a[j - l] % prime[i] == 0) { res++; a[j - l] /= prime[i]; } num[j - l] = num[j - l] * (res * k % mod + 1) % mod; } } for(int i = 0; i <= r - l; i++) { if(a[i] != 1) { num[i] = num[i] * (k + 1) % mod; } } ll ans = 0; for(int i = 0; i <= r - l; i++) { ans = (ans + num[i]) % mod; } printf("%lld\n", ans); } return 0; }
Master of Phi
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 998244353; ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T, m; scanf("%d", &T); while(T--) { ll ans = 1, p, k; scanf("%d", &m); for(int i = 1; i <= m; i++) { scanf("%lld %lld", &p, &k); ans = (p * k % mod + p - k + mod) % mod * ans % mod * quick_pow(p, k - 1) % mod; } printf("%lld\n", ans); } return 0; }
Just a Math Problem
#include<cstdio> typedef long long ll; const int N=1000010,P=1000000007; int T,C,tot,p[N/10],i,j,ans,f[N];char mu[N],v[N];ll n; inline int F(ll n){ if(n<N)if(f[n])return f[n]; ll t=0; for(ll i=1,j;i<=n;i=j+1)j=n/(n/i),t+=n/i*(j-i+1); t%=P; if(n<N)f[n]=t; return t; } int main(){ for(mu[1]=1,i=2;i<N;i++){ if(!v[i])mu[i]=-1,p[tot++]=i; for(j=0;j<tot&&i*p[j]<N;j++){ v[i*p[j]]=1; if(i%p[j])mu[i*p[j]]=-mu[i];else break; } } for(scanf("%d",&T);T--;printf("Case #%d: %d\n",++C,(ans+P)%P)){ scanf("%I64d",&n); for(ans=0,i=1;i<=n/i;i++)if(mu[i])ans=(ans+F(n/i/i)*mu[i])%P; } return 0; }
D. Winter is here
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 1e9 + 7; int prime[N], mu[N], num[N], f[N], cnt, n; vector<int> fac[N]; bool st[N]; ll quick_pow(ll a, int n) { ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } void init() { mu[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; mu[i] = -1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { break; } mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = 2 * i; j < N; j += i) { num[i] += num[j]; } if(num[i]) { num[i] = 1ll * num[i] * quick_pow(2, num[i] - 1) % mod; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { f[i] = (f[i] + 1ll * num[j] * mu[j / i] % mod + mod) % mod; } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n; for(int i = 1; i <= n; i++) { int x; cin >> x; num[x]++; } init(); ll ans = 0; for(int i = 2; i < N; i++) { ans = (ans + 1ll * i * f[i] % mod) % mod; } cout << ans << "\n"; return 0; }
Battlestation Operational
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 1e9 + 7; int prime[N], phi[N], mu[N], f[N], cnt, n; bool st[N]; void init() { mu[1] = phi[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { prime[++cnt] = i; mu[i] = -1; phi[i] = i - 1; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } phi[i * prime[j]] = phi[i] * (prime[j] - 1); mu[i * prime[j]] = -mu[i]; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { int l = j, r = j + i; f[l] = (f[l] + (j / i)) % mod; if(r < N) f[r] = (f[r] - (j / i) + mod) % mod; } } for(int i = 1; i < N; i++) { phi[i] = (phi[i] + phi[i - 1]) % mod; mu[i] = (mu[i] + mu[i - 1] + mod) % mod; f[i] = (f[i] + f[i - 1]) % mod; } for(int i = 1; i < N; i++) { f[i] = (f[i] + f[i - 1]) % mod; } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); while(scanf("%d", &n) != EOF) { ll ans = 0; for(int l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans = (ans + 1ll * (mu[r] - mu[l - 1]) * f[n / l] % mod + mod) % mod; } ans = (ans + phi[n] - n + mod) % mod; printf("%lld\n", ans); } return 0; }
RXD and math
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 1e9 + 7; int quick_pow(ll a, ll n) { a %= mod; ll ans = 1; while(n) { if(n & 1) ans = ans * a % mod; a = a * a % mod; n >>= 1; } return ans; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); ll n, k, cas = 1; while(cin >> n >> k) { printf("Case #%d: %d\n", cas++, quick_pow(n, k)); } return 0; }
GCD?LCM!
/* Author : lifehappy */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10, mod = 258280327; ll prime[N], k[N], primes[N], g[N], f[N], cnt, n; bool st[N]; void init() { k[1] = 1; for(int i = 2; i < N; i++) { if(!st[i]) { primes[i] = i; prime[++cnt] = i; k[i] = 2; } for(int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) { st[i * prime[j]] = 1; if(i % prime[j] == 0) { k[i * prime[j]] = k[i / primes[i]] * 2; primes[i * prime[j]] = primes[i] * prime[j]; break; } k[i * prime[j]] = k[i] * 2; primes[i * prime[j]] = prime[j]; } } for(int i = 1; i < N; i++) { for(int j = i; j < N; j += i) { g[j] = (g[j] + k[j / i - 1]) % mod; } } for(int i = 1; i < N; i++) { f[i] = (f[i - 1] + 2ll * i - 1 - g[i - 1] + mod) % mod; } for(int i = 1; i < N; i++) { f[i] = (f[i - 1] + f[i]) % mod; } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); init(); int T; scanf("%d", &T); while(T--) { scanf("%d", &n); printf("%lld\n", f[n]); } return 0; }