Description
Qinz大牛很爱猜想,所以经常能在比赛中YY出一些公式,并取得出其不意的效果。Qinz大牛坐火车去深圳实习,在漫长无聊的火车上,大牛又提出了一个想,“1+1=2”,他想一个数是否都能分解为两个奇素数的和呢?如果能的话,那一共会有多少对这样的数呢?(p1+p2=n,p2+p1=n,只能算一组)并将这样的数对定义为Qinz对,Qinz大牛没有带电脑,但他又很想知道他的这个猜想是否正确。现在由你来回答这个问题。
后来Qinz大牛发现他和哥德巴赫大牛不谋而合。并为此得意很久。
Input
第一行T,表示测试用例数,接下来T组测试用例
每一组测试用例有一个输入N(4<=N<=2^15),表示要分解的数。
Output
只有一行,输出答案
Sample Input
4
5
8
10
32768
Sample Output
0
1
2
244
Hint
10=3+7,10=5+5,所以有两组这样的数
10=3+7,10=7+3算一组。
解题思路:
主要考察的就是素数的判断,不多说。
#include<iostream>
using namespace std;
const int INF = 32770;
bool isPrime[INF];
int primes[INF/6];
void getPrimes()
{
for(int i=0;i<INF;++i)
isPrime[i] = true;
int t = 0;
for(int i=2;i<INF;++i)
{
if(isPrime[i])
{
for(int j=i+i;j<INF;j+=i)
{
isPrime[j] = false;
}
primes[t++] = i;
}
}
}
int Qinz(int num)
{
int t = 0;
for(int i=1;primes[i]<=num/2;++i)
{
if(isPrime[num-primes[i]])
++t;
}
return t;
}
int main()
{
int T;
cin>>T;
getPrimes();
for(int test=0;test<T;++test)
{
int N;
cin>>N;
if(N%2==1)
{
cout<<0<<endl;
continue;
}
cout<<Qinz(N)<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s