intread(M); int ans = 1; for (int p = 2; p <= M; ++p) { if (!(M % p)) { int times = 0; while (!(M % p)) ++times, M /= p; ans = lcm(ans, solve(p) * qpow(p, times - 1)); } } printf("%d\n", ans);
int f1 = 0, f2 = 1, f3; for (int i = 1; ; i++) { f3 = (f1 + f2) % M, f1 = f2, f2 = f3; if (f1 == 0) { if (f2 == 1) return i; ll t = 1; for (int j = 1; ; ++j) { t = (t * f2) % M; if (t % M == 1) return i * j; } } }
// 质因数分解 autogetfactor(int x){ vector<array<int, 2>> res; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { int cnt = 0; while (x % i == 0) { x /= i; cnt++; } res.push_back({ i, cnt }); } } if (x > 1) res.push_back({ x, 1 }); returnmove(res); }
// 枚举约数 autogetdivisor(int x){ auto factor = getfactor(x); vector<array<int, 2>> res; auto dfs = [&](thisauto&& self, int x, int sum, int id) -> void { if (id == factor.size()) { res.push_back({ x, sum }); } elsefor (int i = 0; i <= factor[id][1]; i++) { self(x, sum + i, id + 1); x *= factor[id][0]; } }; dfs(1, 0, 0); sort(res.begin(), res.end()); returnmove(res); }
bool isntPrime[N]; vector<int> prime; voiddoPrime(int mx) { for (int i = 2; i <= mx; i++) { if (!isntPrime[i]) prime.push_back(i); for (auto p : prime) { if (p * i > mx) break; isntPrime[p * i] = 1; if (i % p == 0) break; } } isntPrime[1] = 1; }
int p[N]; int c[N]; int m;
voiddivide(int n) { cout << n << " = "; m = 0; for (auto ps : prime) { if (ps * ps > n) break; if (n % ps == 0) { p[++m] = ps, c[m] = 0; while (n % ps == 0) n /= ps, c[m]++; } } if (n > 1) { p[++m] = n; c[m] = 1; } for (int i = 1; i <= m; i++) { cout << p[i] << "^" << c[i] << " "; } cout << endl; }
intnumOfDivisors(int x){ int ans = 1; for (int i = 2; i * i <= x; i++) { int r = 0; while (x % i == 0) ++r, x /= i; if (r) ans *= r + 1; } if (x > 1) ans *= 2; return ans; }
voideachT(){ int p = 1; for (int i = 2; ; i++) { if (numOfDivisors(p) > 500) { printf("%d\n", p); break; } p += i; } }
答案 76576500,约 19ms。
枚举一个数的约数
1 2 3 4 5 6 7 8 9 10
vector<ll> factor(ll x){ vector<ll> d; for (ll i = 1; i * i <= x; i++) { if (x % i) continue; d.push_back(i); if (i != x / i) d.push_back(x / i); } sort(d.begin(), d.end()); return d; };
#include<cstdio> #include<algorithm> using ll = longlong; constexprint MOD = 9901; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
ll qpow(ll a, ll n){ ll ans = 1; while (n) { if (n & 1) ans = ans * a % MOD; a = a * a % MOD; n >>= 1; } return ans; }
ll qq(ll a, ll n){ if (n == 1) { return1; } elseif (n & 1) { return (qq(a, n - 1) + qpow(a, n - 1)) % MOD; } else { returnqq(a, n / 2) * (qpow(a, n / 2) + 1) % MOD; } }
intmain(){ ll a = read(), b = read();
if (a == 0) printf("0\n"); elseif (a == 1) printf("1\n"); elseif (b == 0) printf("1\n"); else { ll ans = 1; for (ll i = 2; i <= a; i++) { if (a % i) continue; ll cnt = 0; while (a % i == 0) { ++cnt; a /= i; } ans = ans * qq(i % MOD, (cnt * b + 1)) % MOD; } printf("%lld\n", ans); }
#include<cstdio> using ll = longlong; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
voideachT(){ int a = read(), b = read(), c = read();
int v = a + b - c; int ans = 0;
if (v < 0) { ans = 0; } elseif (v == 0) { ans = -1; } else { auto solve = [&](int a, int b, int c, int x) { while (a || b || c) { if ((a % x + b % x) % x != c % x) return0; a /= x, b /= x, c /= x; } return1; }; for (int i = 2; 1ll * i * i <= v; i++) { if (v % i == 0) { ans += solve(a, b, c, i); if (i != v / i) ans += solve(a, b, c, v / i); } } if (v > 1) ans += solve(a, b, c, v); }
printf("%d\n", ans); }
intmain(){ for (int T = read(); T--; eachT()); return0; }
intremoveCommonP(int a, int b){ for (int i = 2; i * i <= b; i++) { if (!(b % i)) while (!(a % i)) a /= i; while (!(b % i)) b /= i; } if (b != 1) while (!(a % b)) a /= b; return a; } // 去掉a中与b共有的素因子
#include<cstdio> #include<algorithm> constint maxN = 2e5 + 7; int n, ans, a[maxN];
inlineintgcd(int a, int b){ return b > 0 ? gcd(b, a % b) : a; }
boolsol(int k){ int m = 0; for (int i = 1; i <= n - k; i++) { m = gcd(m, abs(a[i + k] - a[i])); } return m != 1; }
intmain(){ int T; scanf("%d", &T); while (T--) { ans = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i * i <= n; i++) { if (n % i == 0) { if (i * i == n) { ans += sol(i); } else { ans += sol(i); ans += sol(n / i); } } } printf("%d\n", ans); }
int n = read(), k = read(), ans = 0; for (int i = 1; i <= n / i; i++) { if (n % i == 0) { if (i >= k) ans = max(ans, n / i); if (i <= n / k) ans = max(ans, i); } } print(ans);
枚举 1 ~ N 每个数的约数
1 2 3 4 5 6 7 8
vector<int> fac[N]; voidinit(){ for (int i = 1; i < N; i++) { for (int j = 1; i * j < N; j++) { fac[i * j].push_back(i); } } }
voidinit(int N){ isntPrime.resize(N + 1); for (int i = 2; i <= N; i++) { if (!isntPrime[i]) prime.push_back(i); for (auto& p : prime) { if (1ll * i * p > N) break; isntPrime[i * p] = 1; if (i % p == 0) break; } } isntPrime[1] = 1; } } sieve;
voidinit(){ vector<ll> a(len); for (ll i = 0; i < len; i++) a[i] = L + i;
primeFactor.resize(len);
for (auto& p : prime) { if (1ll * p * p > R) break; for (ll i = (-L % p + p) % p; i < len; i += p) { if (a[i] % p) continue; int c = 0; while (a[i] % p == 0) a[i] /= p, ++c; primeFactor[i].emplace_back(p, c); } }
for (ll i = 0; i < len; i++) { if (a[i] > 1) primeFactor[i].emplace_back(a[i], 1); } }
vector<ll> factor(ll x){ vector<ll> d;
d.push_back(1); for (auto& [p, c] : primeFactor[x]) { ll siz = d.size(); for (ll i = 0, pow = p; i < c; i++, pow *= p) { for (ll k = 0; k < siz; ++k) d.push_back(d[k] * pow); } }
return d; }
voidsolve(ll l, ll r){ L = l, R = r, len = R - L + 1;
init(); for (ll i = 0; i < len; i++) { for (auto& d : factor(i)) cal(i, d); } } };
#include<cstdio> #include<algorithm> #include<vector> usingnamespace std; using ll = longlong; using pii = pair<int, int>; using pll = pair<ll, ll>; constexprint N = 1e6 + 8; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
structSieve { ... } sieve;
structDivisor { ... };
voidbeforeT(){ sieve.init(1000000); }
// 获取数码和 intgetDigitSum(ll x){ int sum = 0; while (x) sum += x % 10, x /= 10; return sum; }
ll n; vector<ll> res; voidDivisor::cal(ll num, ll d){ if (n % d == getDigitSum(d)) { res.push_back(d); } }
voideachT(){ n = read(); vector<ll>().swap(res);
Divisor div; div.solve(max(1ll, n - 108), n);
sort(res.begin(), res.end()); int siz = unique(res.begin(), res.end()) - res.begin(); printf("%d\n", siz); }
intmain(){ beforeT(); for (int T = read(); T--; eachT()); return0; }
赛时写法如下,保证计数不重,但暂不知原理:
1 2 3 4 5 6 7 8 9 10 11 12
voidDivisor::cal(ll num, ll d){ if (d >= 10 && getDigitSum(d) == R - L - num) { sum += 1; } }
voideachT(){ ll n = read(); sum = 0; div.solve(max(1ll, n - 108), n); printf("%lld\n", sum); }
反素数
Description
对于任何正整数x,其约数的个数记作g(x),例如g(1)=1、g(6)=4。
如果某个正整数x 满足:对于任意的小于x 的正整数i,都有g(x)>g(i),则称x 为反素数。
例如,整数1,2,4,6 等都是反素数。
现在给定一个数N,请求出不超过N 的最大的反素数。
输入格式
一个正整数N。
输出格式
一个整数,表示不超过N 的最大反素数。
数据范围
1≤N≤2∗109
输入样例:
1
1000
输出样例:
1
840
Notes
注意到:
对于一个N ,设答案为x ,那么x 的约数一定是1∼N 中最多的
若有y 的约数与x 的约数一样多,那么一定有x<y
设x=p1c1p2c2…pmcm ,一定有c1⩾c2⩾⋯⩾cm
x 的质因子p 只会在2,3,5,7,11,13,17,19,23 中取, 因为2∗3∗5∗7∗11∗13∗17∗19∗23∗29 已经大于2e9
int m; int p[N]; int c[N]; voiddivide(int n) { m = 0; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { p[++m] = i; c[m] = 0; while (n % i == 0) c[m]++, n /= i; } } if (n > 1) // n是质数 { p[++m] = n, c[m] = 1; } }
voideachT() { int n = read(); divide(n); ll ans = n; for (int i = 1; i <= m; i++) { ans = ans * (p[i] - 1) / p[i]; // 注意这里不能缩写 } cout << ans << endl; }
时间复杂度:$O(\sqrt{ N })$ 若加上素数筛,时间复杂度的常数会更小 # 暴力枚举 lcm
intgcd(int a, int b){ return b ? gcd(b, a % b) : a; } intlcm(int a, int b){ return1ll * a * b / gcd(a, b); }
constexprint N = 1e5 + 8; vector<int> divisor[N]; vector<pii> pairs[N]; voidinitlcm(){ for (int i = 1; i < N; i++) { for (int L = i; L < N; L += i) divisor[L].emplace_back(i); } for (int i = 1; i < N; i++) { for (int L = i; L < N; L += i) { for (int& j : divisor[L]) { if (i >= j andlcm(i, j) == L) pairs[L].emplace_back(i, j); } } } }
#include<cstdio> #include<algorithm> using ll = longlong; constint N = 1e5 + 10; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
ll gcd(ll a, ll b){ return b ? gcd(b, a % b) : a; }
intmain(){ int n = read(); ll D = read();
ll d = read(); for (int i = 2; i <= n; i++) { ll x = read(); d = gcd(d, read()); }
ll left = D % d; printf("%lld\n", min(left, d - left));
#include<cstdio> #include<map> #include<vector> using ll = longlong; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
// 并查集 constint N = 2e3 + 8; int fa[N]; inlinevoidinit(){ for (int i = 0; i < N; i++) fa[i] = i; } intfind(int x){ return fa[x] == x ? x : fa[x] = find(fa[x]); } inlinevoiduno(int x, int y){ fa[find(x)] = find(y); } inlineboolsame(int x, int y){ returnfind(x) == find(y); }
voideachT(){ int n = read(); vector<int> a(n); for (auto& x : a) x = read();
init(); vector<pair<int, int> > ans; for (int k = n - 1; k >= 1; k--) { vector<int> mp(k, -1); for (int i = 0; i < n; i++) { auto& j = mp[a[i] % k]; if (j != -1 && !same(i, j)) { uno(i, j); ans.push_back({ i, j }); break; } else { j = i; } } }
printf("YES\n"); for (int i = ans.size() - 1; i >= 0; i--) { auto& [u, v] = ans[i]; printf("%d %d\n", u + 1, v + 1); } }
intmain(){ for (int T = read(); T--; eachT()); return0; }