TLE代码,直到咋写了再贴正确的,先保存一下
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 1000004;
int arr[N];
int n;
int cut=0;
int num;
int ans;
bool isComp[N]; //是不是素数
void isCop(bool isComp[], int n)
{
isComp[1] = 1; //1的特判
for (int i = 2;i * i <= n;i++)
{
if (isComp[i] == 0) //如果是素数
for (int j = i * i;j <= n;j += i) //将他的倍数记为合数
isComp[j] = 1; //标记
}
}
bool ask(int x) {
for (int i = 1; x > 0; i += 2) //变化步长为2, 初值为1,一直减到N大于0
{
x -= i;
}
if (x == 0)
return true; //如果N减到最后,恰好等于0,就是平方数
else
return false; //否则,就不是平方数
}
void dfs(int m, int sum, int startx) {//最重要的递归
//m代表现在选择了多少个数
//sum表示当前的和
//startx表示升序排列,以免算重
if (m == 2) {//如果选完了的话
if (ask(sum))
ans++;//ans加一
return;
}
for (int i = startx; i < n; i++)
{
dfs(m + 1, sum * arr[i], i + 1);
}//递归
//步数要加一,和也要加
//升序起始值要变成i+1,以免算重
// //这一个步骤下,所有的都枚举完了
//直接返回去
return;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tt;cin >> tt;
isCop(isComp,N);//预处理
while (tt--) {
cin >> n;
for (int i = 0;i < n;i++) {
cin >> arr[i];
}
ans = 0;
dfs(0, 1, 0);
cout << ans << endl;
}
}