HDU 5833 Zhu and 772002(高斯消元)
题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007。
思路:每个数可以拆成素数相乘的形式,例如:
x1 2=2^1 * 3^0 * 5^0;
x2 3=2^0 * 3^1 * 5^0;
x3 4=2^2 * 3^0 * 5^0;
x4 5=2^0 * 3^0 * 5^1;
x5 6=2^1 * 3^1 * 5^0;
x6 15=2^0 * 3^1 * 5^1;
用xi表示第i个数选或不选,xi的取值为0或1;因为相乘结果为完全平方数,所以最后的完全平方数表示成素数相乘的形式后,每个素数的幂一定是偶数,即模2等于0:
2 (x1+2*x3+x5)%2=0
3 (x2+x5+x6)%2=0
5 (x4+x6)%2=0
将上面的式子转化为异或方程组,求解有m个自由变量,每个自由变量都可以取0或1,最终答案为2^m-1(去掉全0的情况);
#include <bits/stdc++.h>
using namespace std;
#define MAXN 2000
int prime[MAXN+];
int a[MAXN+][];
int free_num;
int free_x[MAXN];
int x[];
int equ,var;
const int mod=;
void getprime()
{
int i,j;
memset(prime,,sizeof(prime));
prime[]=prime[]=;
for(i=;i<=MAXN;i++)
{
if(prime[i])
prime[++prime[]]=i;
for(j=;j<=prime[]&&i*prime[j]<=MAXN;j++)
{
prime[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
}
void geta(int id,long long num)
{
int i;
i=;
while(num!=)
{
while(num%prime[i]==)
{
num/=prime[i];
a[i-][id]^=;
}
i++;
}
}
//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数
int Gauss()
{
int max_r, col, k;
free_num = ;
for(k = , col = ; k < equ && col < var; k++, col++)
{
max_r = k;
for(int i = k ; i < equ; i++)
if(abs(a[i][col]==)
{
max_r = i;
break;
}
if(a[max_r][col] == )
{
k--;
free_x[free_num++] = col; //自由变元
continue;
}
if(max_r != k)
{
for(int j = col; j < var+; j++)
swap(a[k][j],a[max_r][j]);
}
for(int i = k+; i < equ;i++)
if(a[i][col] != )
for(int j = col; j < var+;j++)
a[i][j] ^= a[k][j];
}
for(int i = k;i < equ;i++)
if(a[i][col] != )
return -;
if(k < var)return var-k;
return ;
}
int main()
{
int ans;
int t;
int n;
int i;
int cas;
int freex;
long long num;
scanf("%d",&t);
getprime();
//printf("%d\n",prime[0]);
for(cas=;cas<=t;cas++)
{
memset(a,,sizeof(a));
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%I64d",&num);
geta(i,num);
}
equ=prime[];
var=n;
freex=Gauss();
//printf("::%d\n",freex);
if(freex==-)
ans=;
else if(freex==)
ans=;
else
{
ans=;
for(i=;i<freex;i++)
{
ans=(*ans)%mod;
}
ans--;
}
printf("Case #%d:\n%d\n",cas,ans);
}
return ;
}
HDU 5833 Zhu and 772002(高斯消元)的更多相关文章
- hdu 5833 Zhu and 772002 高斯消元
Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...
- HDU - 5833: Zhu and 772002 (高斯消元-自由元)
pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...
- HDU 5833 Zhu and 772002
HDU 5833 Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 5833 Zhu and 772002 ccpc网络赛 高斯消元法
传送门:hdu 5833 Zhu and 772002 题意:给n个数,每个数的素数因子不大于2000,让你从其中选则大于等于1个数相乘之后的结果为完全平方数 思路: 小于等于2000的素数一共也只有 ...
- HDU 5833 Zhu and 772002 (高斯消元)
Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...
- HDU 5755 Gambler Bo(高斯消元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5755 [题目大意] 一个n*m由0,1,2组成的矩阵,每次操作可以选取一个方格,使得它加上2之后对 ...
- HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...
- ACM学习历程—HDU 3949 XOR(xor高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题目大意是给n个数,然后随便取几个数求xor和,求第k小的.(重复不计算) 首先想把所有xor的 ...
- 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...
- HDU 3571 N-dimensional Sphere(高斯消元 数论题)
这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...
随机推荐
- css浏览器兼容问题
https://www.douban.com/group/topic/4629864/
- PHP正则表达式模式修饰符详解
PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...
- Go - 数组 和 切片(array、slice)
一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...
- 使用github pages, hexo搭建个人博客教程
具体的原理性的东西就不说了直接上教程,怕等下自己忘了. 一. github 阶段 申请一个github 账号并成功登录进去. 创建一个名字为xxx.github.io的空项目. 二. hexo 阶段 ...
- BZOJ 4725: [POI2017]Reprezentacje ró?nicowe
Description 一个数列. \(a_1=1,a_2=2\) 当 \(n>2\) 时 \[a_n = \{ \begin {matrix} 2a_{n-1},\text{n is an ...
- python的os模块
1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.返回指定目录下的所有文件和目录名:os.listdir() 3.函数用来删除一个文件:os.remove() ...
- MVC中使用Action全局过滤器出现:网页无法正常运作 将您重定向的次数过多。解决办法
前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...
- Java GridBagLayout 简单使用
这里只介绍了很基础布局构建及使用,主要是关于 GridBagLayout. 首先整套流程大概是, 声明一个 GridBagLayout 对象 private GridBagLayout gridBag ...
- 导入excel数据到数据库
1.上传excel到服务器 jsp页面代码 <form action="actionname" method="post" id="form1& ...
- jdbc连接数据库(mysql,sqlserver,oracle)
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...