CF895C Square Subsets 题解
看到 \(a_i\le 70\) 后,发现 \(n\) 啥用没有,因为只需要枚举 \(1-70\) 选几个即可。
看到求完全平方数后,想到分解质因数,由于 \(a_i\le 70\),所以只有 \(19\) 个质数,可以进行状压 dp。
设 \(dp_{i,j}\) 表示枚举到 \(i\),状态为 \(j\) 的方案数,便有:
\]
其中 \(x\) 为 \(i\) 分解后的状态。
当然,我们忽略了一些情况,没有考虑到我们有很多种达到标准的方式,比如你放 \(1\) 个和放 \(3\) 个效果一样,你放这 \(3\) 个和放那 \(3\) 个效果一样。
所以,放奇数个的方案数为(\(a_i\) 表示数列里有多少个 \(i\)):
\]
放偶数个的方案数为:
\]
所以:
\]
时间复杂度 \(O(n+70\times 2^{19})\),空间复杂度 \(O(70\times 2^{19})\),注意不要 \(T/MLE\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1e9+7;
const int N=75,M=1<<19;
int n,m,pr[25],t[N];
int dp[N][M+5],a[N];
ll qpow(ll x,int y){
if(y<0) return 1;
ll re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p;
y>>=1;
}return re;
}int main(){
cin>>n;
for(int i=1,x;i<=n;i++)
cin>>x,a[x]++;
memset(t,1,sizeof(t));
t[1]=0;dp[0][0]=1;
for(int i=2;i<=70;i++){
if(t[i]) t[i]=++m,pr[m]=i;
for(int j=1;j<=m&&pr[j]*i<=70;j++){
t[i*pr[j]]=0;
if(i%pr[j]==0) break;
}
}for(int i=1;i<=70;i++){
int x=0,z=i;
for(int j=1;pr[j]*pr[j]<=i;j++)
while(z%pr[j]==0)
x^=(1<<(j-1)),z/=pr[j];
if(z>1) x^=(1<<(t[z]-1));
int zjy=qpow(2,a[i]-1);
for(int j=0;j<M;j++){
dp[i][j]=(dp[i][j]+(ll)dp[i-1][j]*zjy%p)%p;
if(a[i]) dp[i][j^x]=(dp[i][j^x]+(ll)dp[i-1][j]*zjy%p)%p;
}
}cout<<(dp[70][0]+p-1)%p;
return 0;
}//Kaká
CF895C Square Subsets 题解的更多相关文章
- CF895C: Square Subsets && 【BZOJ2844】albus就是要第一个出场
CF895C: Square Subsets && [BZOJ2844]albus就是要第一个出场 这两道题很类似,都是线性基的计数问题,解题的核心思想也一样. CF895C Squa ...
- [CF895C]Square Subsets
题目大意:给一个集合$S$($1\leq S_i\leq 70$),选择一个非空子集,使它们的乘积等于某个整数的平方的方法的数量. 求方案数,若两种方法选择的元素的索引不同,则认为是不同的方法. 题解 ...
- 洛谷CF895C Square Subsets(线性基)
洛谷传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题意: 给你n个数,每个数<=70,问有多少个集合,满足集合中所有数相乘是个完全平方数(空集除外) 题解: 完全看不出这玩意儿和线性基有什 ...
- CF895C Square Subsets (组合数+状压DP+简单数论)
题目大意:给你一个序列,你可以在序列中任选一个子序列,求子序列每一项的积是一个平方数的方案数. 1<=a[i]<=70 因为任何一个大于2的数都可以表示成几个质数的幂的乘积 所以我们预处理 ...
- CF895C Square Subsets [线性基]
线性基的题- 考虑平方数只和拆解质因子的个数的奇偶性有关系 比如说你 \(4\) 和 \(16\) 的贡献都是一样的.因为 \(4 = 2^2 , 16 = 2^4\) \(2\) 和 \(4\) 奇 ...
- Codeforces Round #448 C. Square Subsets
题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...
- Codeforces 895C - Square Subsets
895C - Square Subsets 思路:状压dp. 每个数最大到70,1到70有19个质数,给这19个质数标号,与状态中的每一位对应. 状压:一个数含有这个质因子奇数个,那么他状态的这一位是 ...
- Codeforces 895.C Square Subsets
C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces 895C Square Subsets(状压DP 或 异或线性基)
题目链接 Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...
- Codeforces 895C - Square Subsets 状压DP
题意: 给了n个数,要求有几个子集使子集中元素的和为一个数的平方. 题解: 因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数.可以使用状压DP,每一位上0表 ...
随机推荐
- 使用LOGSTASH 将数据导入到ES
logstash 执行过程 input -->filter -->output filter 可以对数据进行处理 输出插件 codec plugin 使用脚本将数据导入到ES input ...
- MySql 9 in Docker 利用克隆插件搭建主从
环境说明 Docker Windows 11 MySql 9.1.0 搭建步骤 1. 准备主库 准备一个主库的配置文件 master.cnf [mysqld] server-id=1 log-bin= ...
- 开源USB协议栈漏洞挖掘
文章首发于 https://forum.butian.net/share/169 目录 起因 漏洞挖掘 sboot_stm32 tinyusb dfu_moded_control_xfer_cb 越界 ...
- [双体系练习]Java基础练习题1
因为练习是word,本文我只是写了里面的部分内容,如果想查阅完整内容或者获取word以及PDF,请 关注微信公众号 乖乖狼科技 发送口令 akcd T1 静态代码块中不能? · [D ] A. 初始化 ...
- 【C#】【报错解决】分析器错误消息: 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider
1.工具->NuGet包管理器->程序包管理控制台 2.在程序包管理控制台中输入 PM> Install-Package Microsoft.CodeDom.Providers.Do ...
- spring boot 配置多个DispatcherServlet
传统的web项目,只需要在web.xml里配置多个即可,并且支持多个url-pattern 在spring boot中,我们默认无需配置,系统会自动装配一个,感兴趣的可以看下源码 org.spring ...
- win10家庭版升级到专业版密钥
J7QT3-3GCPG-9GVWT-CH2XR-GMRJM
- 【Rive】眼睛互动动画
1 前言 本文基于 Rive 社区开放的眼睛动画,进一步加工处理,实现更有趣的眼睛互动动画. 原始资源见 → Eye Joysticks Demo,效果如下. 原始资源只有一只眼睛,并且没 ...
- 你的语言模型实际是一个奖励模型!😁Direct Preference Optimization:Your Language Model🎭is Secretly a Reward Model
直接偏好优化:你的语言模型实际上是一个奖励模型 其实每张PPT图下面还有解释的注释,但放上去还要改格式,太多啦!所以就靠大家读论文脑补啦! 摘要 1.引言 2.相关工作 3.预备知识 4.直接偏好优化 ...
- Matlab R2009b 版 license 到期问题
打开2009b Matlab,反复提示需要激活,是lisense到期了,到期时间2017年11月11日.解决方法: 将以下内容替换 Matlab 安装路径下 license/*.lic 文件中的所有内 ...