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;
}
posted @ 2022-10-06 15:13  fzj2007  阅读(16)  评论(0编辑  收藏  举报