Codeforces 895C - Square Subsets 状压DP
题意:
给了n个数,要求有几个子集使子集中元素的和为一个数的平方。
题解:
因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数。可以使用状压DP,每一位上0表示这个质数的个数为偶数个,1表示为奇数个。这样的话,如果某个数为一个数的平方的话,那么每个质数个数都是偶数,用0可以表示。从1-70开始状压DP,先存下每个数出现多少次,然后dp转移,dp转移时分别计算某个数出现奇数次还是偶数次的方案数.
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
const int MOD = 1e9+;
int vec[],tran[],sum[MAX_N];
int dp[][(<<)+];
int prime[] = { , , , , , , , , , , , , , , , , , , };
int main()
{
int N,M,T;
while(cin>>N)
{
memset(vec,,sizeof(vec));
memset(tran,,sizeof(tran));
memset(sum,,sizeof(sum));
memset(dp,,sizeof(dp));
for(int i=;i<N;i++)
{
int temp;
scanf("%d",&temp);
vec[temp] ++;
}
for(int i=;i<=;i++)
{
int t = i;
for(int j=;j<;j++)
{
while(t%prime[j] == )
{
tran[i] ^= (<<j);
t /= prime[j];
}
}
}
sum[] = ;
for(int i=;i<=N;i++)
{
sum[i] = (sum[i-]*)%MOD;
}
dp[][] = ;
for(int i=;i<=;i++)
{ if(vec[i] == )
{
for(int j=;j<(<<);j++) dp[i][j] = dp[i-][j];
}
else
{
for(int j=;j<(<<);j++)
{
//奇数
dp[i][j^tran[i]] = (dp[i][j^tran[i]] + (long long )dp[i-][j]*sum[vec[i]-])%MOD;
//偶数
dp[i][j] = (dp[i][j] + (long long )dp[i-][j]*sum[vec[i]-])%MOD;
}
}
}
cout<<(dp[][] - )%MOD<<endl;
}
return ;
}
Codeforces 895C - Square Subsets 状压DP的更多相关文章
- Codeforces 895C Square Subsets(状压DP 或 异或线性基)
题目链接 Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...
- Codeforces 895C - Square Subsets
895C - Square Subsets 思路:状压dp. 每个数最大到70,1到70有19个质数,给这19个质数标号,与状态中的每一位对应. 状压:一个数含有这个质因子奇数个,那么他状态的这一位是 ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
- Codeforces 917C - Pollywog(状压 dp+矩阵优化)
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...
- Codeforces 79D - Password(状压 dp+差分转化)
Codeforces 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻 ...
- Codeforces 544E Remembering Strings 状压dp
题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...
- codeforces 21D. Traveling Graph 状压dp
题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...
- CodeForces 327E Axis Walking(状压DP+卡常技巧)
Iahub wants to meet his girlfriend Iahubina. They both live in Ox axis (the horizontal axis). Iahub ...
- Codeforces ----- Kefa and Dishes [状压dp]
题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...
随机推荐
- 房上的猫:if选择结构
一.基本if结构: 1.定义:if选择结构是根据条件判断之后再做处理的一种语法结构! 2.逻辑:首先对条件进行判断 >如果为真,则执行代码块 >如果为假,执行代码块后面的部分二.常用逻 ...
- Augustus安装小记
之前安装过一次Augustus,由于节点重新部署后,原来安装的硬盘被格掉了,今天重新安装的时候出了一些问题,记录一下. 1. 需要boost,安装好boost之后,虽然将其加入到~/.bashrc配置 ...
- 执行查询“BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\...”失败,错误如下:“无法执行 BACKUP LOG,因为当前没有数据库备份。 BACKUP LOG 正在异常终止。
执行查询"BACKUP LOG [XXX] TO DISK = N'F:\\BackData\\事务日至备份\\..."失败,错误如下:"无法执行 BACKUP LOG ...
- 为什么树莓派不会受到 Spectre 和 Meltdown 攻击
最近爆出来的 Intel CPU 的底层漏洞可谓是影响巨大,过去20年的电脑都可能会受影响.前几天 Raspberry Pi 的官方 Twitter(@Raspberry_Pi) 转推了这篇文章,通过 ...
- Windows下搭建Redis服务器
Redis服务器是当下比较流行的缓存服务器,Redis通常被人拿来和Memcached进行对比.在我看来,应当是各具优势吧,虽然应用场景基本类似,但总会根据项目的不同来进行不通的选用. 我们今天主要讲 ...
- Mac appium apk覆盖性安装的问题
/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/appium-android-driver/n ...
- Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集
S4/HANA里有一个新的UI框架叫做Smart template, 配合ABAP后台的CDS view技术,能够让developer以Metadata driven的方式来开发Fiori应用, 这种 ...
- 多个JDK使用批处理命令切换JDK版本
本篇博客参考的链接 http://blog.csdn.net/hu199055/article/details/70145389 https://www.cnblogs.com/xdp-gacl/p/ ...
- flask WTForms源码分析及自定义WTForms
首先我们来创建一个From类 from wtforms.form import Form from wtforms import StringField from wtforms.validators ...
- IdentityServer Topics(4)- 登录
为了使IdentityServer代表用户发布令牌,该用户必须登录到IdentityServer. Cookie认证 使用来自ASP.NET Core的cookie身份验证处理程序管理的cookie跟 ...