結果
問題 | No.2262 Fractions |
ユーザー |
![]() |
提出日時 | 2023-04-07 23:15:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 5,300 bytes |
コンパイル時間 | 1,521 ms |
コンパイル使用メモリ | 128,472 KB |
最終ジャッジ日時 | 2025-02-12 02:38:56 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 23 TLE * 22 |
ソースコード
#include <iostream>#include <algorithm>#include <iomanip>#include <vector>#include <queue>#include <deque>#include <set>#include <map>#include <tuple>#include <cmath>#include <numeric>#include <functional>#include <cassert>#define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl;#define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl;template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }using namespace std;typedef long long ll;template<typename T>vector<vector<T>> vec2d(int n, int m, T v){return vector<vector<T>>(n, vector<T>(m, v));}template<typename T>vector<vector<vector<T>>> vec3d(int n, int m, int k, T v){return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, v)));}template<typename T>void print_vector(vector<T> v, char delimiter=' '){if(v.empty()) {cout << endl;return;}for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter;cout << v.back() << endl;}/*** 有理数の計算用。dが分母でnが分子。* atcoderだとたいていmodintで足りるが、Project Eulerだとたまに使える。*/template <typename T>class frac{public:T n, d;frac(T _n, T _d){T g = gcd(_n, _d);n = _n/g;d = _d/g;if(d < 0) {d *= -1;n *= -1;}}frac operator+(frac f){return frac(n*f.d+d*f.n, f.d*d);}frac operator-(frac f){return frac(n*f.d-d*f.n, f.d*d);}frac operator*(frac f){return frac(f.n*n, f.d*d);}frac inv(){return frac(d, n);}bool operator<(frac f){if(d*f.d < 0) return n*f.d-d*f.n > 0;else return n*f.d-d*f.n < 0;}bool operator>(frac f){if(d*f.d < 0) return n*f.d-d*f.n < 0;else return n*f.d-d*f.n > 0;}bool operator==(frac f){return n*f.d-d*f.n == 0;}void operator+=(frac f){n = n*f.d+d*f.n, d = f.d*d;reduction();}void operator-=(frac f){n = n*f.d-d*f.n, d = f.d*d;reduction();}void reduction(){T g = gcd(n, d);n /= g, d /= g;}};template <typename T>bool operator<(const frac<T> f1, const frac<T> f2){if(f1.d*f2.d < 0) return f1.n*f2.d-f1.d*f2.n > 0;else return f1.n*f2.d-f1.d*f2.n < 0;}template <typename T>bool operator>(const frac<T> f1, const frac<T> f2){if(f1.d*f2.d < 0) return f1.n*f2.d-f1.d*f2.n > 0;else return f1.n*f2.d-f1.d*f2.n > 0;}template <typename T>bool operator==(const frac<T> f1, const frac<T> f2){return f1.n*f2.d-f1.d*f2.n == 0;}template <typename T>ostream& operator<<(ostream& os, const frac<T>& f){os << f.n << '/' << f.d;return os;}class Eratosthenes{public:int m;vector<bool> is_prime;vector<int> primes;Eratosthenes(int m_){m = m_;init();}private:void init(){is_prime.assign(m+1, true);is_prime[0] = false, is_prime[1] = false;for(int i = 2; i <= m; i++){if(is_prime[i]){primes.push_back(i);for(int j = 2; i*j <= m; j++) is_prime[i*j] = false;}}}};const int N = 300000;Eratosthenes et(N);vector<int> facs[N+1];int meb[N+1];void init(){for(int x = 1; x <= N; x++) meb[x] = 1;for(int p: et.primes){for(int i = 1; i*p <= N; i++){if(i%p == 0){meb[i*p] = 0;}else{meb[i*p] *= -1;}}}for(int x = 1; x <= N; x++){if(meb[x] == 0) continue;for(int i = 1; i*x <= N; i++){facs[i*x].push_back(x);}}}using F = frac<ll>;const int M = 1000000000;void solve(){ll n; ll k; cin >> n >> k;ll sum = 0;// x/n以下になるやつの個数auto count = [&](ll x){ll ans = 0;for(int i = 1; i <= n; i++){ll tmp = 0;for(int j: facs[i]){ll r = min((x*i)/n, n);tmp += (ll)meb[j]*(r/j);}ans += tmp;}return ans;};if(count(n*n) < k){cout << -1 << endl;return;}ll l = 0, r = n*n;while(r-l > 1){ll x = (l+r)/2;if(count(x) < k) l = x;else r = x;}ll cnt_r = count(r);vector<F> fs;for(int x = 1; x <= n; x++){// (l/n) < y/x <= (r/n)ll yl = (l*x)/n;if(yl > n) continue;ll yr = (r*x)/n;chmin(yr, n);for(ll y = yl; y <= yr; y++){if(gcd(x, y) != 1) continue;fs.push_back(F(y, x));if(x == 407 && y == 2023){}}}sort(fs.begin(), fs.end());ll cur = cnt_r;while(cur > k){fs.pop_back();cur--;}cout << fs.back() << endl;}int main(){ios::sync_with_stdio(false);cin.tie(0);cout << setprecision(10) << fixed;init();int t; cin >> t;while(t--) solve();}