【牛客 - 125A】灰魔法師(打表,暴力)
阿新 • • 發佈:2018-11-01
題幹:
給出長度為n的序列a, 求有多少對數對 (i, j) (1 <= i < j <= n) 滿足 ai + aj 為完全平方數。
輸入描述:
第一行一個整數 n (1 <= n <= 105)
第二行 n 個整數 ai (1 <= ai <= 105)
輸出描述:
輸出一個整數,表示滿足上述條件的數對個數。
示例1
輸入
3
1 3 6
輸出
2
說明
滿足條件的有 (1, 2), (2, 3) 兩對。
解題報告:
這題不算難,但是我想知道為啥帶個log就wa?
AC程式碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 3e5 + 5; int box[MAX]; int main() { int n; scanf("%d",&n); ll ans=0; for(int i=1; i<=n; i++) { int t; scanf("%d",&t); for(int j=2; j<=500; j++) { if(j*j>t) ans+=box[j*j-t]; } box[t]++; } printf("%lld",ans); return 0; }
WA程式碼:(還是說這種做法就不對?)
#include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; int n,tot; ll biao[505000]; ll a[100005]; int main() { cin>>n; for(ll i = 1; i*i<=(ll)7e5; i++) { biao[++tot] = i*i; // printf("%d\n",biao[i]); } for(int i = 1; i<=n; i++) { scanf("%lld",a+i); } sort(a+1,a+n+1); ll ans = 0; for(int i = 1; i<=n; i++) { for(int j = 1; j<=tot; j++) { if(biao[j]-a[i] < a[1] || biao[j]-a[i] > a[n]) continue; if(binary_search(a+1,a+n+1,biao[j]-a[i])) { ans += upper_bound(a+1,a+n+1,biao[j]-a[i]) - lower_bound(a+1,a+n+1,biao[j]-a[i]); } } } printf("%lld\n",ans/2); return 0 ; }