HDU 5833 Zhu and 772002
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 |
Case #1: |
【题解】
分解质因数 + 高斯消元
对于容易一个输入的数进行分解质因数,保存到矩阵的各个行中。
每个数都能看作若干个质数相乘,若每个质数的指数均为偶数,这个数即是完全平方数。因此用10表示奇偶,每个数的合并/化简就能用异或来操作。
然后用异或高斯消元,得到矩阵的秩r,接着得到(n - r)个可自由组合的完全平方数。最后组合数求和,去掉什么都不选的情况,结果为2n - 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的更多相关文章
- 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 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(高斯消元)
题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...
- HDU 5833 Zhu and 772002 (数论+高斯消元)
题目链接 题意:给定n个数,这n个数的素因子值不超过2000,从中取任意个数使其乘积为完全平方数,问有多少种取法. 题解:开始用素筛枚举写了半天TLE了,后来队友说高斯消元才想起来,果断用模板.赛后又 ...
- hdu 5833 Zhu and 772002 异或方程组高斯消元
ccpc网赛卡住的一道题 蓝书上的原题 但是当时没看过蓝书 今天又找出来看看 其实也不是特别懂 但比以前是了解了一点了 主要还是要想到构造异或方程组 异或方程组的消元只需要xor就好搞了 数学真的是硬 ...
- HDU - 5833: Zhu and 772002 (高斯消元-自由元)
pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...
- HDU 5833 Zhu and 772002 ——线性基
[题目分析] 这题貌似在UVA上做过,高精度高斯消元. 练习赛T2,然后突然脑洞出来一个用Bitset的方法. 发现代码只需要30多行就A掉了 Bitset大法好 [代码] #include < ...
- 【HDU 5833】Zhu and 772002(异或方程组高斯消元)
300个最大质因数小于2000的数,选若干个它们的乘积为完全平方数有多少种方案. 合法方案的每个数的质因数的个数的奇偶值异或起来为0. 比如12=2^2*3,对应的奇偶值为01(2的个数是偶数为0,3 ...
随机推荐
- linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59417.html linux设备驱动归纳总结(三):2.字符型设备的操作open.close.rea ...
- Asp.Net Mvc视图引擎Razor介绍
1.Razor介绍 1)ASP.NET MVC3 带来了一种新的名为Razor 的视图引擎,提供了下列优点: Razor 的语法简单且清晰,只需要最小化的输入 Razor 容易学习,语法类似于 C# ...
- Android开发的进阶之路
客户端开发工程师,简单地从某几个方面描述一下个人理解里不同的等级: 1.初级的可以熟练使用系统框架提供的组件,搭建所需应用程序: 2.中级的,会对系统框架中如view绘制.broadcast机制.内存 ...
- WinCE Show App Icon
找个图片,例如背景透明的jpg或png,上http://www.pic2icon.com/smartphone_wince_icon_generator.php这个网站转换下. 在项目属性中,设为图标 ...
- Oracle错误:ORA-01033
Oracle错误:ORA-01033 错误编码:ORA-01033: ORACLE initialization or shutdown in progress 故障描述:因为移动了数据库文件([NA ...
- mongo 日记
分组代码片段 命令行代码: aggregate({$group:{_id:{A:'$A',B:'$B',C:'$C'}}}) 拿出唯一号有重复的数据: > db.aaaa.aggregate([ ...
- mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉mysql再备份,一般很少用,因为很多应用不允许长时间停机,停机备份的可以直接CP数 ...
- MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示
初学Rxjava,目前只能遍历加载指定目录下的所有文件夹中的照片,文件夹中如果还嵌套有文件夹目前还没找到实现方法. 先看mvp目录结构: 很抱歉,没有model. 接下来是view层的接口代码和pre ...
- 系统图片uri的问题
调用系统图库会出现两种uri的问题,一个是在文件管理器中的图库中,获取到的地址为:content://media/external/images/media/972 这种格式 另外一种的是系统文件管 ...
- Java BIO、NIO、AIO-------转载
先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Ja ...