1. 程式人生 > >【牛客 - 125A】灰魔法師(打表,暴力)

【牛客 - 125A】灰魔法師(打表,暴力)

題幹:

給出長度為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 ;
}