题解 | #Math#
Guess and lies
https://ac.nowcoder.com/acm/contest/11254/A
E - Math
题意: 求的答案
题解: 打表找规律,找到两种
- 第一种是形如
这样的二元组,预处理
内的立方即可
- 第二种是一个递推的关系
,
也预处理一下即可
- 计算过程中会爆
,开__int128即可
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define dbg(x...) do{ cout << #x << " -> "; err(x);} while (0) void err() { cout << endl;} template<class T, class ...Ts> void err(const T& arg, const Ts&... args) { cout << arg << " "; err(args...);} typedef long long ll; const int maxn = 1e6 + 7; ll a[maxn], n, b[maxn]; void run(int n) { int ans = 0; printf("n -> %d\n", n); for(int i = 1; i <= n; i++) { for(int j = i; j <= n; j++) if((i * i + j * j) % (i * j + 1) == 0) { if(i * i * i != j) printf("(%d,%d)\n", i, j); ans++; } } printf("%d\n", ans); puts("*************"); } void solve() { scanf("%lld", &n); int idx1 = upper_bound(a + 1, a + 1000001, n) - a - 1; int idx2 = upper_bound(b + 1, b + 4587 + 1, n) - b - 1; ll ans = idx1 + idx2; printf("%lld\n", ans); } void init() { int num = 0; __int128 now = 0, pre = 0, nxt = 0, bas = 0; for(__int128 i = 2; i <= 1000000; i++) { now = i * i * i; pre = i * i; bas = i; while(1) { nxt = pre * now - bas; if(nxt > 1000000000000000000) break; b[++num] = (ll)nxt; bas = now; now = nxt; } } sort(b + 1, b + 1 + 4587); } int main() { int t = 1; for(ll i = 1; i <= 1000000; i++) a[i] = i * i * i; init(); scanf("%d", &t); while (t--) solve(); // for(int i = 10000; i <= 10000; i++) // run(i); return 0; }