题目大意:给出n个数字a[],将a[]分解为质因子(保证分解所得的质因子不大于2000),任选一个或多个质因子,使其乘积为完全平方数。求其方法数。

学长学姐们比赛时做的,当时我一脸懵逼的不会搞……所以第二天上午花了一上午学习了一下线性代数。

题目思路:

任选一个或多个质因子,起乘积为完全数m,因为组成它的均为素数,假设组成m的素数的种类为n,那么这n类素数中每类素数的个数应为偶数。

可设:a[i][j]=0代表第i种素数可在a[j]中分离出的个数为偶数,a[i][j]=1代表第i种素数可在a[j]中分离出的个数为奇数数。

          b[i]=1代表选择这类素数,b[i]=0代表不选择这类素数。

列出线性方程组:

a11x1+a12x2+...+a1nxn=0

a21x1+a22x2+...+a2nxn=0

...

an1x1+an2x2+...+annxn=0

求解的个数 ans

转化为矩阵形式:

矩阵A=

a11 a12 a13 …………a1n

a21 a22 a23 …………a2n

……………………………………

……………………………………

an1 an2 an3 …………ann

通过初等变换可将矩阵A换成类似下面矩阵B的形式

a11 a12 a13 ……a1n

0     a22 a23 ……a2n

0       0    a33……a3n

0       0    0    ……arn

再将矩阵B转化成线性方程组 可求出最后一组方程的解,倒着往回求可求出所有方程解

可解出的方程组共 r 个,由秩的定义可知 r等矩阵A的秩

由定理:

对于n元齐次线性方程组如果r<n,则方程组含n-r个自由未知量。

解的个数ans=2^(n-r)-1(减去全0解)

具体操作:

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f
#define MAX 2105
#define MOD 1000000007 using namespace std; long long c[MAX][],p[MAX],v[MAX],a[MAX],cnt,n;//c存矩阵,p存素数表,cnt代表素数的个数 void MakeTab()//打素数表
{
int i,j;
memset(v,,sizeof(v));
memset(p,,sizeof(p));
cnt=;
for(i=; i<=; i++)
{
if(!v[i])
{
p[++cnt]=i;
for(j=i; j<=; j+=i)
{
v[j]=;
}
}
}
} int Rank()//计算秩
{
int i,j,k,r,u;
i=;
j=;
while(i<=cnt && j<=n)
{
r=i;
while(!c[r][j] && r<=cnt)
r++;
if(c[r][j])
{
swap(c[i],c[r]);//如果发现了第r行第j列为1,就讲r行和i行行互换(初等行变换)
for(u=i+; u<=cnt; u++)
{
if(c[u][j])
{
for(k=i; k<=n; k++)
{
c[u][k]=c[u][k]^c[i][k];//每找到一个未知数就对其进行亦或处理,去掉系数c[i][k]
} }
}
i++;
}
j++;
}
return i;
} int main()
{
MakeTab();
int i,j,cns=,T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
memset(c,,sizeof(c));
for(i=; i<=n; i++)
{
scanf("%lld",&a[i]);
} for(i=; i<=n; i++)
{
for(j=; j<=cnt; j++)
{
long long num=a[i];
if(num%p[j]==)
{
while(num%p[j]==)
{
num/=p[j];
c[j][i]=c[j][i]^;
}
}
}
} long long k=(n-Rank());
long long ans=;
for(i=; i<=k; i++)
ans=(ans*)%MOD;
printf("Case #%d:\n",cns++);
printf("%lld\n",ans-);//去掉全0的解
}
return ;
}

【HDU 5833】Zhu and 772002(异或方程组高斯消元讲解)的更多相关文章

  1. hdu 5833 Zhu and 772002 异或方程组高斯消元

    ccpc网赛卡住的一道题 蓝书上的原题 但是当时没看过蓝书 今天又找出来看看 其实也不是特别懂 但比以前是了解了一点了 主要还是要想到构造异或方程组 异或方程组的消元只需要xor就好搞了 数学真的是硬 ...

  2. 【HDU 5833】Zhu and 772002(异或方程组高斯消元)

    300个最大质因数小于2000的数,选若干个它们的乘积为完全平方数有多少种方案. 合法方案的每个数的质因数的个数的奇偶值异或起来为0. 比如12=2^2*3,对应的奇偶值为01(2的个数是偶数为0,3 ...

  3. 3364 Lanterns (异或方程组高斯消元)

    基本思路.首先构造一个n*(m+1)的矩阵,同时标记一个行数row,row从零开始,然后找出每一列第一个非零的数,和第row行互换, 然后对row到n行,异或运算.最终的结果为2^(m-row) #i ...

  4. hdu 5833 Zhu and 772002 ccpc网络赛 高斯消元法

    传送门:hdu 5833 Zhu and 772002 题意:给n个数,每个数的素数因子不大于2000,让你从其中选则大于等于1个数相乘之后的结果为完全平方数 思路: 小于等于2000的素数一共也只有 ...

  5. HDU 5833 Zhu and 772002

    HDU 5833 Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  6. HDU 5833 Zhu and 772002 (高斯消元)

    Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...

  7. hdu 5833 Zhu and 772002 高斯消元

    Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...

  8. HDU 2262 Where is the canteen 期望dp+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...

  9. 【HDU 3949】 XOR (线性基,高斯消元)

    XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. c socket(续)

    存在两种字节顺序:NBO与HBO 网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题. 主机字节顺序(HBO,Host ...

  2. jquery 画板折叠

    <!doctype html><html lang="en"><head> <meta charset="utf-8" ...

  3. 浙大pat 1062题解

    1061. Dating (20) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holmes ...

  4. LeetCode OJ 121. Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  5. ural 1355. Bald Spot Revisited(数的素因子划分)

    1355. Bald Spot Revisited Time limit: 1.0 secondMemory limit: 64 MB A student dreamt that he walked ...

  6. git提交失败

    git push "提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支."的解决办法 本地已存在项目,需要先获取远端更新并与本地合并,再git push具体操作如下: ...

  7. 如何让图片在div里面剧中显示

    你可能有很多种方式,但是这种方式我觉得更加简单,供大家参考. 用一个 display:inline-block 的helper容器高度为height: 100% 并且vertical-align: m ...

  8. javascript 深入浅出 (未完成4-17)

    慕课网javascript总结 课程地址 课程大纲: 一.数据类型 二.表达式和运算符 三.语句 四.对象 五.数组 六.函数 七.this 八.闭包和作用域 九.OOP 十.正则与模式匹配 ---- ...

  9. android ndk调用OpenGL 实现纹理贴图Texture

    android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39  CSDN博客 原文  http://blog.csdn.net/chrisfxs/a ...

  10. CodeFroces--Good Bye 2016-A-New Year and Hurry(水题-模拟)

    A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...