結果
問題 | No.1653 Squarefree |
ユーザー |
👑 ![]() |
提出日時 | 2021-08-20 22:57:30 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 203 ms / 2,000 ms |
コード長 | 2,073 bytes |
コンパイル時間 | 2,138 ms |
コンパイル使用メモリ | 200,472 KB |
最終ジャッジ日時 | 2025-01-24 00:17:06 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
#define _USE_MATH_DEFINES#include <bits/stdc++.h>using namespace std;#define FOR(i,m,n) for(int i=(m);i<(n);++i)#define REP(i,n) FOR(i,0,n)#define ALL(v) (v).begin(),(v).end()using ll = long long;constexpr int INF = 0x3f3f3f3f;constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;constexpr double EPS = 1e-8;constexpr int MOD = 1000000007;// constexpr int MOD = 998244353;constexpr int dy[] = {1, 0, -1, 0}, dx[] = {0, -1, 0, 1};constexpr int dy8[] = {1, 1, 0, -1, -1, -1, 0, 1}, dx8[] = {0, -1, -1, -1, 0, 1, 1, 1};template <typename T, typename U> inline bool chmax(T &a, U b) { return a < b ? (a = b, true) : false; }template <typename T, typename U> inline bool chmin(T &a, U b) { return a > b ? (a = b, true) : false; }struct IOSetup {IOSetup() {std::cin.tie(nullptr);std::ios_base::sync_with_stdio(false);std::cout << fixed << setprecision(20);}} iosetup;std::vector<int> prime_sieve(int n, bool get_only_prime) {std::vector<int> prime, smallest_prime_factor(n + 1);std::iota(smallest_prime_factor.begin(), smallest_prime_factor.end(), 0);for (int i = 2; i <= n; ++i) {if (smallest_prime_factor[i] == i) prime.emplace_back(i);for (int p : prime) {if (i * p > n || p > smallest_prime_factor[i]) break;smallest_prime_factor[i * p] = p;}}return get_only_prime ? prime : smallest_prime_factor;}int main() {constexpr int M = 1000000;ll l, r; cin >> l >> r;vector<int> is_squarefree(r - l + 1, true);vector<ll> tmp(r - l + 1);iota(ALL(tmp), l);for (int p : prime_sieve(M, true)) {assert(p >= 1);for (ll i = (l + p - 1) / p * p; i <= r; i += p) {const int idx = i - l;if (!is_squarefree[idx] || tmp[idx] % p > 0) continue;tmp[idx] /= p;if (tmp[idx] % p == 0) is_squarefree[idx] = false;}}int ans = 0;REP(i, r - l + 1) {if (!is_squarefree[i]) continue;if (tmp[i] == 1) {++ans;} else {ll sq = llround(sqrt(tmp[i]));ans += sq * sq != tmp[i];}}cout << ans << '\n';return 0;}