题目大意:给你一个序列,你可以在序列中任选一个子序列,求子序列每一项的积是一个平方数的方案数。

1<=a[i]<=70

因为任何一个大于2的数都可以表示成几个质数的幂的乘积

所以我们预处理70以内的质数,把它作为二进制状压的状态,每个在序列中出现数Hash一下,组合数推一下

所以把奇次幂的状态表示为1,偶次幂的状态就是0,比如6就是11,42就是1011

而平方数的每个质因子的指数都是偶数,所以最终结果的状态就是0000000...

转移的过程,两个数的乘积,就是这两个数的质因子二进制的状态的合并,即异或(xor)运算

卡常很恶心,懒得进一步优化了

好吧据说可以推出结论,这个组合数加起来其实是2的幂次

 #include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100100
#define M 75
#define mod 1000000007
#define C(m,n) (((fac[n]*inv[m])%mod*inv[n-m])%mod)
#define ll long long
using namespace std; int xx,n,now,lst;
int hx[M];
ll x,y,t;
ll inv[N],fac[N],f[][(<<)+];
int pr[]={,,,,,,,,,,,,,,,,,,};
int gc()
{
int rett=,fh=;char c=getchar();
while(c<''||c>'') {if(c=='-')fh=-; c=getchar();}
while(c>=''&&c<='') {rett=rett*+c-'';c=getchar();}
return rett*fh;
}
void exgcd(ll a,ll b)
{
if(b==) {x=,y=;}
else {exgcd(b,a%b);t=x;x=y;y=t-a/b*y;}
}
void get_inv()
{
inv[]=inv[]=,fac[]=fac[]=;
for(ll i=;i<=n;i++)
{
exgcd(i,mod);
fac[i]=(fac[i-]*i)%mod;
x=(x%mod+mod)%mod;
inv[i]=(inv[i-]*x)%mod;
}
} int main()
{
//freopen("aa.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++) xx=gc(),hx[xx]++;
get_inv();
now=,lst=,f[][]=;
for(int i=;i<=;i++)
{
if(!hx[i]) continue;
int s=,x=i;
for(int j=;j<;j++)
{
while(x%pr[j]==)
{
s^=(<<j);
x/=pr[j];
}
}
for(int p=;p<(<<);p++)
{
if(!f[lst][p]) continue;
for(int j=;j<=hx[i];j++)
{
if(j&)
{
f[now][p^s]+=(f[lst][p]*C(j,hx[i]))%mod;
f[now][p^s]%=mod;
}else{
f[now][p]+=(f[lst][p]*C(j,hx[i]))%mod;
f[now][p]%=mod;
}
}
f[lst][p]=;
}
swap(now,lst);
}
printf("%I64d\n",f[lst][]-);
return ;
}

CF895C Square Subsets (组合数+状压DP+简单数论)的更多相关文章

  1. Codeforces 895C Square Subsets(状压DP 或 异或线性基)

    题目链接  Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...

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

    题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...

  3. 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)

    传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi​表示保证集合iii中所有点都连通其余点随意的方案数. gig ...

  4. Codeforces 895C - Square Subsets 状压DP

    题意: 给了n个数,要求有几个子集使子集中元素的和为一个数的平方. 题解: 因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数.可以使用状压DP,每一位上0表 ...

  5. 简单状压dp的思考 - 最大独立集问题和最大团问题 - 贰

    接着上文 题目链接:最大独立集问题 上次说到,一种用状压DP解决任意无向图最大团问题(MCP)的方程是: 注:此处popcountmax代表按照二进制位下1的个数作为关键字比较,即选择二进制位下1的个 ...

  6. 简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹

    本文参考:CPH ,USACO Guide (大佬请越过,这是初学笔记,不要吐槽内容) 前置知识:位运算基础,动态规划基础 介绍 状态是元素的子集的动态规划算法,可以用位运算来高效的优化. 那么第一道 ...

  7. POJ 3254 简单状压DP

    没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...

  8. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  9. HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

    题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空 ...

随机推荐

  1. WEBGL学习【八】模型视图投影矩阵

    <!--探讨WEBGL中不同图形的绘制方法:[待测试2017.11.6]--> <!DOCTYPE HTML> <html lang="en"> ...

  2. [网络流24题] 最长k可重线段集问题 (费用流)

    洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...

  3. 设置ssh会话过期时间

    客户端配置选项: 编辑配置文件 ~/.ssh/config 加入以下配置项,如不存在新建一个即可: Host * ServerAliveInterval 300 ServerAliveCountMax ...

  4. springMVC入门截图

    mvc在bs系统下的应用 ---------------------------------------------------- 在web.xml中配置前端控制器(系统提供的一个servlet类   ...

  5. spring和struts整合

    整合准备:导入jar包 如果只是访问action,没有做数据库方面的操作的话 只需要导入下面的jar spring相关jar 以及struts相关jar包 整合过程: 用到了struts所以需要在we ...

  6. 告诉你 SQL 数据库与 NoSQL 数据库的区别

    简单来说 SQL 数据库和 NoSQL 数据库有着共同的目标:存储数据,但存储的方式不同 一. 表 SQL中的表结构具有严格的数据模式约束: 存储数据很难出错. NoSQL存储数据更加灵活自由:可能导 ...

  7. 如何利用eclipse实现批量修改文件的编码方式

        在eclipse+Eclipse环境下,打开一个jsp文件,经常发现汉字无法显示,右键点击查看这个文件属性,发现文件的字符编码属性为ISO-8859-1.    目前的解决方法有:1. 手工把 ...

  8. linux下sort对中文排序

    http://blog.csdn.net/luoleicn/article/details/6162358 设置: export LC_ALL=C;

  9. 怎样改动 VC6.0 4.0 2010 打印预览界面上的文字

    前言:尽管早已下决心不再碰微软的东西,但手头的项目还得须要维护. 遇到问题还能解决. 问题由来: 之前的软件开发是基于中文环境开发的,建立项目的时候,选择了中文,为了方便客户使用.我们使用了静态编译的 ...

  10. [HTML5] How Visible vs. Hidden Elements Affect Keyboard/Screen Reader Users (ARIA)

    There are many techniques for hiding content in user interfaces, and not all are created equal! Lear ...