div2从没这么接近过rk100以内的水平。。
想到了奇偶性质模二的素因子表,想到了dp第一维逐渐添加数字,第二维枚举1<<19大约1e6来更新集合
奈何第一维默认了是1-n,算下来复杂度1e10从而卡手做不下去
没完整做出来挺遗憾的吧
#include<bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
using namespace std;
#define ll long long
#define pb push_back
#define FOR(a) for(int i=1;i<=a;i++)
#define sqr(a) (a)*(a)
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
const int mod=1e9+7;
int dp[75][(1<<19)+5]; //前i个数字,生成集合j的加法
const int prime[19]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67};
int base2[maxn];
int cnt[75]; //数字i出现次数
int s[75]; //数字i的因子模2表示
int main(){
for(int i=1;i<=70;i++){
int t=i;
for(int j=0;j<19;j++){
while(t%prime[j]==0)t/=prime[j],s[i]^=(1<<j);
}
}
base2[0]=1;
for(int i=1;i<maxn;i++)base2[i]=(base2[i-1]*2%mod);
int n;scanf("%d",&n);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
cnt[x]++;
}
dp[0][0]=1;
for(int i=1;i<=70;i++){
if(!cnt[i]){
for(int j=0;j<(1<<19);j++)
dp[i][j]=dp[i-1][j];
}else{
for(int j=0;j<(1<<19);j++){
dp[i][j^s[i]]=(1ll*dp[i][j^s[i]]+1ll*base2[cnt[i]-1]*dp[i-1][j])%mod;
dp[i][j]=(1ll*dp[i][j]+1ll*base2[cnt[i]-1]*dp[i-1][j])%mod;
}
}
}
printf("%d\n",(dp[70][0]+mod-1)%mod);
}