• 895C


    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
    ",(dp[70][0]+mod-1)%mod);
    }



  • 相关阅读:
    CCF CSP 201403-2 窗口
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611207.html
Copyright © 2020-2023  润新知