描述
在古老的大地上,有一种神奇的阵法。这种阵法有四个阵眼,分布在东南西北四个方位,每个方位上可以各自嵌入一个特征值。有一天,一个英雄少年手持一个写有一个数字 n 的宝器来到这片大地,他要在四个阵眼上分别打入一个特征值,如果这些特征值满足以下条件,就能开启阵法:
- 每个特征值是大于1的正整数,除了1和它本身以外不再有其他因数。
- 四个特征值之和是 n。
英雄少年好奇总共有多少种安放特征值的方法,能够开启这个神奇阵法。请你帮他计算一下吧。
输入描述
第一行输入正整数 T,表示有 T 组数据。
以下输入 T 行,每行输入一个正整数 n,含义如题面所述。
输出描述
输出 T 行,每行表示能够开启神奇阵法的特征值安放方案数。
用例输入 1
2 9 10
用例输出 1
4 6
提示
n 为 9 的时候,有四组:{2,2,2,3},{2,2,3,2},{2,3,2,2},{3,2,2,2}。
数据范围
对于 100% 的数据, T≤10。
对于 10% 的数据,n≤10。
对于 40% 的数据,n≤100。
对于 70% 的数据,n≤1000。
对于 100% 的数据,n≤100000。
//先预处理,然后枚举范围,计算乘积求和
#include <iostream>
using namespace std;
bool vis[100005];
long long f[100005];
int q[100005];
void cal()
{
int cnt = 0;
for(int i = 2;i <= 100000;i++)//质数
{
if(!vis[i]) q[++cnt] = i;//记录
for(int j = 1; j <= cnt && i * q[j] <= 100000;j++)
{
vis[i * q[j]] = true;//把范围内所有质数相乘得到的和书排除
if(i % q[j] == 0) break;
}
}
for(int i = 1; i <= cnt; i++)
{
for(int j = 1; j <= cnt && q[i] + q[j] <= 100000;j++)
{
f[q[i] + q[j]]++;//求和方法数++
}
}
return;
}
int main()
{
int t;
cin >> t;
cal();//预处理
while(t--)
{
int n;
cin >> n;
long long ans = 0;
for(int i = 4; i <= n - 4;i++)
{
ans += f[i] * f[n-i];
}
cout << ans << endl;
}
return 0;
}