HDU 5833 Zhu and 772002

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Description

题目描述

Zhu and 772002 are both good at math. One day, Zhu wants to test the ability of 772002, so he asks 772002 to solve a math problem.

But 772002 has a appointment with his girl friend. So 772002 gives this problem to you.

There are n numbers a1,a2,...,an. The value of the prime factors of each number does not exceed 2000, you can choose at least one number and multiply them, then you can get a number b .

How many different ways of choices can make b is a perfect square number. The answer maybe too large, so you should output the answer modulo by 1000000007.

Zhu和772002都擅长数学。 某天,Zhu想试试772002的能耐,就给772002出了道数学题。

但772002与女票有约在先,果断甩锅予你。

有n个数a1,a2,...,an每个数的质因数不超过2000,你可以选择至少一个数并将所选的数相乘,得到b

有多少种选择方式可以使b为完全平方数。结果可能非常大,输出时模1000000007

Input

输入

First line is a positive integer T, represents there are T test cases.

For each test case:

First line includes a number n(1≤n≤300),next line there are n numbers a1,a2,...,an,(1≤ai≤1018).

第一行是一个整数T(T≤100),表示有T个测试用例的数量。

对于每个测试用例:

第一行有一个整数n(1≤n≤300),下一行有n个数a1,a2,...,an,(1≤ai≤1018)

Output

输出

For the i-th test case, first output Case #i: in a single line.

Then output the answer of i-th test case modulo by 1000000007.

对于第i个测试用例,先输出一行Case #i:。

然后输出第i个测试用例的答案模1000000007后的结果。

Sample Input - 输入样例

Sample Output - 输出样例

2
3
3 3 4
3
2 2 2

Case #1:
3
Case #2:
3

【题解】

  分解质因数 + 高斯消元

  对于容易一个输入的数进行分解质因数,保存到矩阵的各个行中。

  每个数都能看作若干个质数相乘,若每个质数的指数均为偶数,这个数即是完全平方数。因此用10表示奇偶,每个数的合并/化简就能用异或来操作。

  然后用异或高斯消元,得到矩阵的秩r,接着得到(n - r)个可自由组合的完全平方数。最后组合数求和,去掉什么都不选的情况,结果为2- 1。

  (啪!迷之巴掌)

  好吧,其实我一开始根本不知道高斯消元是什么鬼。刚刚开始的理解就是分解质因数(形成多项式),压入矩阵方便求基底(当成向量来看),然后默默地发现高斯消元就是矩阵化简吧……

【代码 C++】

 #include <cstdio>
#include <cstring>
#define pMX 2005
#define mod 1000000007
int prim[] = { }, iP, mtx[][];
void getPrim() {
int i, j;
bool mark[pMX];
memset(mark, , sizeof(mark));
for (i = ; i < pMX; i += ) {
if (mark[i]) continue;
prim[++iP] = i;
for (j = i << ; j < pMX; j += i) mark[j] = ;
}
}
void tPrim(int y, __int64 a) {
int i, j;
for (i = ; i <= iP && a >= prim[i]; ++i) {
if (a / prim[i] * prim[i] == a) {
for (j = ; a / prim[i] * prim[i] == a; a /= prim[i]) ++j;
mtx[y][i] = j & ;
}
}
}
int mTS(int n){
bool inUS[]; memset(inUS, , sizeof(inUS));
int size = , i, j, k, ik;
for (j = ; j <= iP; ++j){
for (i = ; i < n; ++i){
if (inUS[i] == && mtx[i][j] == ) break;
}
if (i == n) continue;
inUS[i] = ; ++size;
for (k = ; k < n; ++k){
if (inUS[k] || mtx[k][j] == ) continue;
for (ik = j; ik <= iP; ++ik) mtx[k][ik] ^= mtx[i][ik];
}
}
return n - size;
}
__int64 qMod(__int64 a, int n){
__int64 opt = ;
while (n){
if (n & ) opt = (opt*a) % mod;
n >>= ;
a = (a*a) % mod;
}
return opt;
}
int main() {
getPrim();
int t, iT, i, n;
__int64 ai;
scanf("%d", &t);
for (iT = ; iT <= t; ++iT) {
printf("Case #%d:\n", iT);
memset(mtx, , sizeof(mtx));
scanf("%d", &n);
for (i = ; i < n; ++i){
scanf("%I64d", &ai);
tPrim(i, ai);
}
printf("%I64d\n", qMod(, mTS(n)) - );
}
return ;
}

HDU 5833 Zhu and 772002的更多相关文章

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

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

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

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

  3. hdu 5833 Zhu and 772002 高斯消元

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

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

    题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...

  5. HDU 5833 Zhu and 772002 (数论+高斯消元)

    题目链接 题意:给定n个数,这n个数的素因子值不超过2000,从中取任意个数使其乘积为完全平方数,问有多少种取法. 题解:开始用素筛枚举写了半天TLE了,后来队友说高斯消元才想起来,果断用模板.赛后又 ...

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

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

  7. HDU - 5833: Zhu and 772002 (高斯消元-自由元)

    pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...

  8. HDU 5833 Zhu and 772002 ——线性基

    [题目分析] 这题貌似在UVA上做过,高精度高斯消元. 练习赛T2,然后突然脑洞出来一个用Bitset的方法. 发现代码只需要30多行就A掉了 Bitset大法好 [代码] #include < ...

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

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

随机推荐

  1. !important------至高无上的宝剑

    如上图,不同来源的两个样式,第一个样式设置了font-weight,第二个没有,浏览器会把它叠加在一起,即浏览器会把各个零散的整合成一个整体.第一个样式color:red,第二个样式color:blu ...

  2. iOS 警告窗口

    - (IBAction)buttonPressed:(id)sender {        NSDate *date=self.datePicker.date;    NSString *messag ...

  3. ubuntu下配置tomcat

    配置tomcat 1.解压 tar -zxvf apache-tomcat-7.0.53.tar.gz 2.修改/bin/catalina.sh cygwin=falsedarwin=falseos4 ...

  4. 14 个 grep 命令的例子 【转】

    转自:https://linux.cn/article-5453-1.html 编译自:http://www.linuxtechi.com/linux-grep-command-with-14-dif ...

  5. 这个Glance的界面该怎么看出问题,为什么状态是SOCKT?

    这个glance的状态图有问题吗?

  6. jquery plugins

    jQuery官网插件 jQuery自定义滚动条样式插件 jQuery custom content scroller examples Twitter typeahead typeahead.js t ...

  7. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  8. 函数参数为int*和int&的区别

    参数为int*,表明参数为指针,调用的时候需要地址,如f(&a): 参数为int&,传引用参数,调用时f(a),“引用类型的形参就通过形实结合,成为实参的一个别名,对形参的任何操作也就 ...

  9. cocos2dx lua bug之module 'lsqlite3' not found

    05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] -------------------------------------- ...

  10. ZOJ 3866 - Cylinder Candy

    3866 - Cylinder Candy Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu ...