CF895C Square Subsets
CF895C Square Subsets
注意到平方数要求每个质因数的幂次均为偶数。
由于 \(70\) 以内仅有 \(19\) 个质因数,考虑将每个 \(a_i\) 按照每个质因数的奇偶性分解为 \(01\) 串。具体的,若 \(p^{2k+1}|a_i(k \in N)\),则 \(a_i\) 对应的 \(01\) 串中该位表示为 \(1\),否则表示为 \(0\)。
将每个 \(a_i\) 对应的 \(01\) 串插入线性基,则线性基可求出最小线性无关组,记其大小为 \(s\)。
则最终的答案为 \(2^{n-s}-1\)。
code
#include<bits/stdc++.h>
using namespace std;
namespace IO{
template<typename T>inline bool read(T &x){
x=0;
char ch=getchar();
bool flag=0,ret=0;
while(ch<'0'||ch>'9') flag=flag||(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(),ret=1;
x=flag?-x:x;
return ret;
}
template<typename T,typename ...Args>inline bool read(T& a,Args& ...args){
return read(a)&&read(args...);
}
template<typename T>void prt(T x){
if(x>9) prt(x/10);
putchar(x%10+'0');
}
template<typename T>inline void put(T x){
if(x<0) putchar('-'),x=-x;
prt(x);
}
template<typename T>inline void put(char ch,T x){
if(x<0) putchar('-'),x=-x;
prt(x);
putchar(ch);
}
template<typename T,typename ...Args>inline void put(T a,Args ...args){
put(a);
put(args...);
}
template<typename T,typename ...Args>inline void put(const char ch,T a,Args ...args){
put(ch,a);
put(ch,args...);
}
inline void put(string s){
for(int i=0,sz=s.length();i<sz;i++) putchar(s[i]);
}
inline void put(const char* s){
for(int i=0,sz=strlen(s);i<sz;i++) putchar(s[i]);
}
}
using namespace IO;
#define N 100005
#define mod 1000000007
inline int power(int x,int y,int p){
int res=1;
while(y){
if(y&1) res=(long long)res*x%p;
x=(long long)x*x%p;
y>>=1;
}
return res;
}
int n,maxn=19,vis[25];
inline void insert(int x){
for(int i=maxn;~i;i--){
if(x>>i&1){
if(vis[i]) x^=vis[i];
else return vis[i]=x,void();
}
}
}
int pri[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67};
int main(){
read(n);
for(int i=1,x;i<=n;i++){
read(x);
int k=0;
for(int j=0;j<19;j++)
if(x%pri[j]==0){
int num=0;
while(x%pri[j]==0) num^=1,x/=pri[j];
k^=num<<j;
}
insert(k);
}
for(int i=19;~i;i--)
if(vis[i]) n--;
put('\n',(power(2,n,mod)+mod-1)%mod);
return 0;
}