codeforces895C Square Subsets

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案 本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。 阅读详情

什么,这是状压DP???
是在下输了…输的心服口服…
ABC都是好题啊…


前排提醒,由于latex没有^这个符号,所以用 ⨁ 代替
首先看看数据范围,70这个玄学范围,emmm…
理性分析查找题解一波,我们想起来要的是完全平方数,那么就可以搞一些大新闻:
用 dp[i][j] 表示前 i 个数达到状态j的情况有多少种,这里的状态 j 表示某一个因子有奇数个还是偶数个,奇数为1偶数为0,显然j=0⇔平方数,所以我们其实是统计 dp[70][0]
由于 n≤70 ,而在 70 个数内一共有19个质数,这无疑证明了我们的思路是可行的。

首先我们需要知道一条结论:
∑n{i|i是偶数}Cin=∑n{i|i是奇数}Cin=2n−1 (1)
那么我们可以预处理出来 s[i] 表示70个数所代表的状态, cnt[i] 表示某个数出现次数, powmod[i] 表示 2i%MOD 的值,然后思考转移。

对于某个数 p ,其状态为s[p]。
如果 cnt[p]=0 ,那么 dp[p][j]=dp[p−1][j]
否则有两种选择,一种是选择奇数个 p ,即

dp[p][j⨁s[p]]+=powmod[cnt[p]−1]×dp[p−1][j⨁s[p]]

这是因为在这种情况下,异或奇数次相当于异或一次,所以这就是求解n个数里选奇数个的情况总和,带入公式(1)即可;
另一种是选择偶数个 p ,即
dp[p][j]+=powmod[cnt[p]−1]×dp[p−1][j]

然后这道题就做完啦!不过注意一个细节,这里不小心将0这种情况算了进去,所以还要-1。
另外开LL数组会爆空间。。

AC代码:(mmp调了半天发现质数表写错了。。)

#include <iostream>
#include <cstdio>
#include <cctype>
#include <algorithm>

using namespace std;
typedef long long LL;
inline LL read(LL &x) {
    x = 0; char c = getchar();
    while(!isdigit(c)) c = getchar();
    while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
}
const LL MOD = 1e9+7;
int prime[19] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
int s[73], cnt[73], powmod[100003], dp[73][(1 << 19)];
inline void fenjie(LL x) {
    int t = x;
    //cout<<x<<" ";
    for(int j = 0; j < 19; ++j) {
        //cout<<x<<" "<<prime[i]<<endl;
        while(t % prime[j] == 0) 
            s[x] ^= (1 << j), t /= prime[j];
    }
}
int main() {
    //freopen("pai.txt", "w", stdout);
    LL n; read(n);
    LL tmp;
    for(int i = 1; i <= 70; ++i) fenjie(i);
    //for(int i = 1; i <= 70; ++i) cout<<s[i]<<endl;
    for(int i = 1; i <= n; ++i) read(tmp), cnt[tmp]++;
    powmod[0] = 1;
    for(int i = 1; i <= n; ++i) powmod[i] = ((1LL) * powmod[i - 1] * 2) % MOD;
    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)*powmod[cnt[i] - 1] * dp[i - 1][j]) % MOD;
                dp[i][j] = ((1LL)*dp[i][j] + (1LL)*powmod[cnt[i] - 1] * dp[i - 1][j]) % MOD;
            }   
    }
    //cout<<dp[1][0]<<endl;
    cout<<(dp[70][0] - 1) % MOD<<endl; 
    return 0;
}

参考资料:
https://www.cnblogs.com/widsom/p/7910385.html
https://www.cnblogs.com/chinacwj/p/7967796.html

React项目实战:用AntV G6打造可折叠组织架构图(附完整代码) 本文详细介绍了如何在React项目中使用AntV G6库构建一个功能完整的可折叠组织架构图。通过实战代码演示了从环境搭建、自定义节点、折叠状态管理到性能优化的全流程,重点解决了企业级应用中处理复杂树形数据、实现流畅交互等核心问题,并提供了可直接复用的组件代码。 阅读详情

相关推荐

从CAD到完美网格:HyperMesh几何清理全流程指南(2023最新版)

本文详细介绍了2023最新版HyperMesh在几何清理和网格划分方面的全流程操作指南。从CAD导入、几何修复到中面提取和网格生成,系统性地分享了实战验证的解决方案,帮助工程师高效处理复杂几何体,提升有限元模型质量。特别针对汽车和航空航天领域的常见问题,提供了智能化工具和优化技巧。

weixin_29306011的博客 227

Codeforces 895C(状压)

题目大意 n个数(n 思路 考虑到,完全平方数是那些每种质因子个数都为偶数的数,所以把每个数都分解成质因子相乘的形式,同时对每种质因子的个数对%2,因为70以内的质数只有19个,所以可以把每个数压位,第i位表示这个数的因子是否有奇数个第i个质数。 压位DP 又因为数的范围只从1~70,所以我们记录每个数出现的次数,有一个dp方程,dp[i][j] 表示考虑前i个数,相乘结果为j(压位

Everything can be done! 598

【可不卸载重装】VS2019新建项目里没有CUDA选项

问题:VS2019 新建项目里没有CUDA选项,vs也属性没有cuda。这是因为你在Visual Studio 2019安装之前,先安装了CUDA Toolkit。

qq_62844901的博客 1321

codeforces895c(状压dp)

C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Petya was late for the lesson too. The te

yypurpose的博客 327

使用STM32F103C8T6控制舵机丝滑运转附代码

使用STM32F103C8T6控制舵机丝滑运转原理和案例,附代码。

m0_63566592的博客 4238

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

【CodeForces 895E】Square Subsets(状态压缩动态规划)

题目链接 【CodeForces895E】Square Subsets 题目大意 给定一个大小为nnn的集合sss,求sss有多少个非空子集中的数的乘积为完全平方数。 n≤100000n≤100000n\le 100000,si≤70si≤70s_i\le 70 题解 首先我们发现,集合中的数都很小。 并且,因为是求完全平方数的个数,所以我们只关心每个素因数出现的奇偶性。 ...

Galaxy Coder 的博客 271

长期换衣行人重识别(Long-Term Clothes-Changing Person Reid)数据集汇总

长期换衣行人重识别任务中目前常用的数据集总览目前换衣数据集的主要问题数据集换衣/总体情况集统计DeepChange(2021)LaST(2021)COCAS(2020)VC-Clothes(2020)LTCC(2020)PRCC(2019)Celebrities-reID(2019) 总览 在长期换衣行人重识别的任务当中,数据集的获取(尤其是对于学术环境下)是一个难点,主要的困难有以下几点: 采集大规模的数据集比较困难。 采集不同的衣服的数据集比较困难。 采集不同衣服不同角度的数据集比较困难。 目前也有

KingsMan666的博客 8384

Codeforces895C. Square Subsets

C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Petya was late for the lesson too. The te

Jelly_acm的博客 1506

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 573

DeerFlow 系列教程 第十二篇 | Tools 工具体系——从内置工具到 MCP 扩展

文件此工具允许 Agent 在运行时创建新的自定义 Agent。@toolsoul: str, # SOUL.md 的完整内容description: str, # Agent 的一行描述创建流程从获取agent_name写入配置文件(包含 name 和 description)写入灵魂文件SOUL.md(定义 Agent 的人格和行为)更新中的错误回滚MCP(Model Context Protocol)是一种标准协议,允许 AI Agent 连接外部工具服务器。DeerFlow 通过。

weixin_43674738的博客 181

codeforces 895C Square Subsets

codeforces 895C Square Subsets

Rising_shit的博客 575

Origin教程004:Origin图形导出

需要编辑的话,双击图形,会自动用origin软件打开图形,这种方式是最开始导出图形的功能,方式一和二都是后面增加的。如果导出的图片边距较大的时候,会影响图片的美观,可以通过。也可以设置在PPT中直接编辑,找到。解决方法是,选择一条线,

WwLK123的博客 6334

codeforces895c Square Subsets

C. Square Subsetstime limit per test4 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputPetya was late for the lesson too. The teacher gave him an additional task. For s...

C_K_Y_的博客 591

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Square Subsets CodeForces - 895C (状压DP)

Square Subsets  题目链接:CodeForces - 895C  题意:从n个数中选出一个非空子集,使得集合中的数的乘积是完全平方数; 思路:首先什么是完全平方数?就是能表示为一个数的平方的数;同时如果x是完全平方数,那么他拥有的质因子p的个数一定为偶数; n个数的范围是[1, 70],1~70一共19个质数;所以我们可以把19个质数的个数的奇偶性压缩成01状态,0表示有偶数...

Sirius_han的博客 476

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Codeforces 895C - Square Subsets

895C - Square Subsets 思路:状压dp。 每个数最大到70,1到70有19个质数,给这19个质数标号,与状态中的每一位对应。 状压:一个数含有这个质因子奇数个,那么他状态的这一位是1,一个数含有这个这个质因子偶数个,那么状态的这一位是0。 那么如果一个数是平方数,那么这个数的状态每一位都是0,即状态为0。 状态转移见代码。 代码: #include&l...

weixin_34283445的博客 171

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

codeforces895C Square Subsets 状压dp

题目链接:戳这里 题目大意:Petya又迟到了...老师给了他额外的任务。对于一个数组a,Petya需要统计从中间选择非空子集,使它们的乘积等于某个整数的平方的方法的数量。 如果这些方法所选择的元素的索引不同,则认为这两种是不同的方法。 因为结果可能很大,结果需要mod 10^9+7。 题解:一个数是完全平方数,说明它的每个质因子都有偶数个,而a数组中的每个元素最大不超过70,那么我们可以

Twin Automata的博客 378

Codeforces 895C - Square Subsets 状压DP

题意:  给了n个数,要求有几个子集使子集中元素的和为一个数的平方。 题解:  因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数。可以使用状压DP,每一位上0表示这个质数的个数为偶数个,1表示为奇数个。这样的话,如果某个数为一个数的平方的话,那么每个质数个数都是偶数,用0可以表示。从1-70开始状压DP,先存下每个数出现多少次,然后dp转...

265

Codeforces895C Square Subsets

Description 给 \(n(1\le n\le 10^5)\) 个数 \(a_i(1\le a_i\le 70)\) 。求非空子集的个数,满足子集中所有的数的积是一个完全平方数。 Solution 因为 \(a_i\le 70\) ,所以我们预处理质因子。二进制 \(sta[i]\) 的第 \(j\) 位表示 \(i\) 这个数(不是 \(a_i\) )分解后是否含第 \(j\) 个质数的...

weixin_30530523的博客 98

codeforces 895 C. Square Subsets(状压dp)

http://codeforces.com/contest/895/problem/C 题意:给出n个数字,问有多少个非空子集的乘积为完全平方数 看见ai范围很小就想着应该围绕ai来做,一直在思考组合数怎么解,发现情况太多太难考虑完全,看题解才想起有状压dp这个东西解决状态数量较少的问题 - _-!!! 思路:考虑一个数字为质因子分解后,如果其为完全平方数,那么每个质因子的次方和肯定为偶数,小于...

- 回忆゛ 207

Codeforces 895.C Square Subsets

C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Petya was late for the lesson too. T...

weixin_30487701的博客 133

Codeforces895 C. Square Subsets(状压dp)

题意: 给定长度为n的序列, 问有多少个子集,满足子集的积是完全平方数, 答案对1e9+7取模 数据范围:n<=1e5,1<=a(i)<=70 解法: 观察到a(i)<=70,打表发现70以内的质数只有19个,容易想到状压. 完全平方数的性质是每个质因子的指数都是偶数, 那么如果用19位二进制数表示质因子的奇偶性,那么完全平方数就是全0, 那么这题可以搞一波状压dp. 令d[i][j]表示前i个数,子集乘积状态为j的方案数. 然而第一维1e5,第二维1e6,空间都开不下. 再观

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 274

Codeforces 895C Square Subsets:状压dp【组合数结论】

题目链接:http://codeforces.com/problemset/problem/895/C 题意:   给你n个数a[i]。(n <= 10^5, 1 <= a[i] <= 70)   问你有多少非空子集s,使得 ∏(s[i])为完全平方数。 题解:   由于a[i] <= 70,而70以内的质数只有19个,显然可以状压。   ...

a1392136的博客 307

codeforces 895C Square Subsets 状压dp

题目大意:给你一个数组,问有多少个非空子集满足集合中所有数字的乘积是一个平方数。结果mod 1e9+7。首先就可以想到把所有数出现的次数记录一下。由于唯一分解定理可知若一个数是平方数,那么它唯一分解后质因子的指数一定是偶数。而且数字都是小于70的,小于70的质数只有20个,于是就可以进行状压dp了。第 i 位为1表示唯一分解后第 i 个质数的质数为奇数,否则为偶数。接着考虑状态转移。若数 k 没出...

numberer的博客 396

Codeforces 895C Square Subsets 状压dp,线性基异或高斯消元

文章目录题意题解 好好的状压dp被搞成蜜汁贪心. 题意 给一些数,求能取出多少个非空子集使所有数相乘为完全平方数. n≤105,ai≤70n\leq 10^5,a_i\leq70n≤105,ai​≤70. 题解 707070以内的质数只有191919个,并且一个数的平方性可以用每一个质数的奇偶性判断,不妨用一个压缩状态来代表某个数的状态是否是奇数. 我们对所有数取状态之后本题变为有多少个集合使状态的异或为0. 列出状态矩阵,进行高斯消元,可以发现答案为2x−12^x-12x−1,其中xxx为该异或方程自由元

Fuko_Ibuki的博客 1万+

Square Subsets CodeForces - 895C(状压dp+质数分解)

Petya was late for the lesson too. The teacher gave him an additional task. For some array a Petya should find the number of different ways to select non-empty subset of elements from it in such a way that their product is equal to a square of some integer

tomjobs的博客 671
上一篇: codeforces895B XK segments
下一篇: codeforces898D Alarmclock
LittleRewriter
博客等级 码龄9年 35粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值