895C - Square Subsets

思路:状压dp。

每个数最大到70,1到70有19个质数,给这19个质数标号,与状态中的每一位对应。

状压:一个数含有这个质因子奇数个,那么他状态的这一位是1,一个数含有这个这个质因子偶数个,那么状态的这一位是0。

那么如果一个数是平方数,那么这个数的状态每一位都是0,即状态为0。

状态转移见代码。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=1e5+;
const int MOD=1e9+;
int a[N];
int cnt[];
int dp[][(<<)+];
int s[];
int prime[]={,,,,,,,,,,,,,,,,,,};
int _2p[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie();
for(int i=;i<=;i++)
{
int t=i;
for(int j=;j<;j++)
{
while(t%prime[j]==)t/=prime[j],s[i]^=(<<j);
}
}
_2p[]=;
for(int i=;i<N;i++)_2p[i]=(_2p[i-]*)%MOD;
int n;
cin>>n;
for(int i=;i<=n;i++)cin>>a[i],cnt[a[i]]++;
dp[][]=;
for(int i=;i<=;i++)
{
if(!cnt[i])
{
for(int j=;j<(<<);j++)
dp[i][j]=dp[i-][j];
}
else
{
for(int j=;j<(<<);j++)
{
dp[i][j^s[i]]=((ll)dp[i][j^s[i]]+(ll)_2p[cnt[i]-]*dp[i-][j])%MOD;//从cnt[i]个数个选奇数个,C(n,1)+C(n,3)+...=2^(n-1)
dp[i][j]=((ll)dp[i][j]+(ll)_2p[cnt[i]-]*dp[i-][j])%MOD;//从cnt[i]个数个选偶数个,C(n,0)+C(n,2)*C(n,4)+...=2^(n-1)
}
}
}
cout<<(dp[][]-)%MOD<<endl;//减去0的情况
return ; }

最新文章

  1. JQUERY MOBILE 中文API站 和 官方论坛
  2. HashMap与ArrayList互相嵌套的代码实现
  3. EXTJS动态改变store的proxy的params
  4. 高效的两段式循环缓冲区──BipBuffer
  5. iOSpush过后返回多级界面
  6. 【原】创建Hive表,分号分隔符“;”引起的异常
  7. IIS修改队列长度(IIS6+IIS7)
  8. SQL Join 的三种类型
  9. ThinkPHP 3.1.2 视图-1
  10. Java DB loadBalance 设计
  11. JavaMail邮件发送不成功的那些坑人情况及分析说明
  12. 1.10 tuple 元组
  13. python __init__() 和__new__()简析
  14. java.io.FileNotFoundException:my-release-key.keyStore拒绝访问
  15. DDB---查询与优化
  16. java的环境变量
  17. codevs1735 方程的解数(meet in the middle)
  18. 在Docker容器中运行Spring Boot的jar包 jar外的配置文件无法生效
  19. [AaronYang] 敏捷开发 教程目录
  20. 23、Xpath

热门文章

  1. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
  2. 待解决:PDF header signature not found
  3. addEventListener的click和onclick的区别
  4. Python3.x(windows系统)安装requests库
  5. soapUi在调用过程中日期参数
  6. define和typedef
  7. 25个c#知识点
  8. linux磁盘分区详解【转】
  9. ubuntu下交叉编译imagemagick
  10. js 注意点