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表 ...
随机推荐
- vue3 封装api接口
新建axiosj.ts import axios from 'axios'; import { showMessage } from "./status"; // 引入状态码文件 ...
- 前端17号学习(html完结)
一.路径 1.目录文件夹和跟目录 实际工作中需要创建一个文件夹来管理他们. 目录文件夹,就是普通文件夹,里面存放页面相关素材,如html文件.图片等. 根目录,打开目录文件夹的第一层就是根目录. 2. ...
- Redis应用—8.相关的缓存框架
大纲 1.Ehcache缓存框架 (1)Ehcache的核心对象 (2)单独使用Ehcache (3)Spring整合Ehcache (4)Spring Boot整合Ehcache (5)实际工作中如 ...
- Shiro安全框架【认证】+【授权】
1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...
- 【前端】【H5 API】实现全屏显示功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 更改 macOS 用户帐户和个人文件夹的名称
https://support.apple.com/zh-cn/HT201548 您可以对创建 macOS 用户帐户时命名的用户帐户和个人文件夹进行重命名. 您的 macOS 用户帐户名称和您个人 ...
- Python爬虫requests判断请求超时并重新post/get发送请求
Python爬虫requests判断请求超时并重新post/get发送请求在使用Python爬虫中,你可以使用requests库来发送网络请求.为了判断请求超时并重新发送请求,你可以设置一个超时时间, ...
- Qt编写可视化大屏电子看板系统23-模块1产量汇总
一.前言 大屏系统采用结构模块化的分层设计思路,一个表对应一个最小模块比如模具产量.零件产量,数据库采集的时候采集对应的表,拿到数据后按照对应的数据规则传给控件绘制,其中模具产量.零件产量两个模块采用 ...
- Qt开源作品1-视频流播放ffmpeg内核
一.前言 好久以前就写过这个工具,后来因为Qt版本的不断升级以及ffmpeg也经历过好多次的迭代,可能从官网下载的ffmpeg搭配原来的代码不能正确编译,因为很多api已经变了,所以这次特意抽空全部整 ...
- Github绝版开源加速神器fastgit下载链接
Github绝版开源加速神器fastgit下载链接: https://pan.baidu.com/s/1R-4rWuxh0_awIRaWCiGWkQ 提取码: yyrg 参考链接:发现一款稳定可靠的 ...