对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数。
输入格式
第一行输入一个n,表示数组的长度,接下来n个整数,第i个数代表ai。
(1≤n≤100000,0≤ai≤100)
输出格式
输出数组中质数对的个数。
提示
样例说明:a1+a2,a2+a1,a2+a3,a3+a2都为质数,总共有四对。
题目中n的个数有很多1e5左右,但是a的值最大才200,所以有很多重复的,首先我们要记录一下某一个数出现的次数,然后两个for循环遍历每一个数
//思路:
//先打个素数表, 然后 在记录每个数出现的次数,然后在用两个for遍历a[i]+a[j]的每一种情况
//如果不是素数就跳过
//当i和j相等的时候说明他们指的同一个数,假设这个数出现了n次,那么会有n*(n-1)中组合
//如果二者不同的话会有n*n种选择
#include<iostream>
#include<map>
#include<set>
using namespace std;
const int N=1e5 + 10;
map<int ,int>mp;
set<int>se;
set<int >::iterator it;
int arr[N];
int a[N];
int prime[210]={1,1,0};
int pow(){
for(int i=0;i*i<=200;i++)
if(prime[i]==0){
for(int j=i+i;j<=200;j+=i)
prime[j]=1;
}
}
int main(){
pow();
int n;
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
mp[x]++;//key为值,value为该数出现的次数
se.insert(x);
}
int pos=0;
for(it=se.begin();it!=se.end();it++){
a[pos++]=*it;
}
int sum=0;
for(int i=0;i<pos;i++){
for(int j=0;j<pos;j++){
if(!prime[a[i]+a[j]]){
if(i==j){
sum+=mp[a[i]]*(mp[a[i]]-1);
}
else sum+=mp[a[i]]*mp[a[j]];
}
}
}
cout<<sum<<endl;
return 0;
}