結果
問題 | No.2474 Empty Quartz |
ユーザー | 鴨志田卓 |
提出日時 | 2023-09-28 17:45:21 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 35 ms / 2,000 ms |
コード長 | 1,384 bytes |
コンパイル時間 | 2,154 ms |
コンパイル使用メモリ | 203,676 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-21 12:24:46 |
合計ジャッジ時間 | 3,313 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
6,812 KB |
testcase_01 | AC | 4 ms
6,944 KB |
testcase_02 | AC | 24 ms
6,940 KB |
testcase_03 | AC | 31 ms
6,940 KB |
testcase_04 | AC | 31 ms
6,940 KB |
testcase_05 | AC | 35 ms
6,944 KB |
testcase_06 | AC | 34 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using i64 = long long; const int N = 1e5 + 10, P = 998244353; bool square(i64 x) { i64 r = sqrt(x); return r * r == x || (r - 1) * (r - 1) == x || (r + 1) * (r + 1) == x; } i64 mysqrt(i64 x) { i64 ret = sqrt(x); while(ret * ret < x) ret ++; while(ret * ret > x) ret --; return ret; } int inv[N], fact[N], invFact[N]; int C(int n, int m) {if(m < 0 || m > n) return 0; return fact[n] * (i64)invFact[m] % P * invFact[n - m] % P;} int solve() { i64 n, k; cin >> n >> k; n ++; i64 delta = n * n - 4 * k; //cout << "delta = " << delta << " "; if(delta < 0 || !square(delta)) return 0; delta = mysqrt(delta); if((n ^ delta) & 1) return 0; i64 ret = C(n - 1, (n + delta) / 2); if(delta) (ret += C(n - 1, (n - delta) / 2)) %= P; return ret; /* (a + b) = n; (a * b) = k; a = n - b; b * (n - b) = k; -b2 + nb - k = 0 n*n - 4k -2 -b */ } int main() { ios::sync_with_stdio(false); cin.tie(0); fact[0] = invFact[0] = inv[1] = fact[1] = invFact[1] = 1; for(int i = 2; i < N; i ++) { fact[i] = fact[i - 1] * (i64)i % P; inv[i] = (P - P / i) * (i64)inv[P % i] % P; invFact[i] = invFact[i - 1] * (i64)inv[i] % P; } int T; cin >> T; while(T --) cout << solve() << "\n"; }