Zhu and 772002
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2342 Accepted Submission(s): 850
Problem 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 .
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 .
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) .
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) .
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 .
Then output the answer of i-th test case modulo by 1000000007 .
Sample Input
2 3 3 3 4 3 2 2 2
Sample Output
Case #1: 3 Case #2: 3
Author
UESTC
Source
有n个最大质因子不超过2000的数字,问从中选数使得乘积是完全平方数的方案有多少种。
用Xi=0/1表示第i个数选/不选。要使乘积为完全平方数,则把乘积质因数分解后,每个质因数的次数都为偶数。由此对每个可能的质因子构造关于Xi的异或方程组求解,求出自由元素的个数m,答案就是2^m-1.(需要减去什么也不选的方案)
刘汝佳白书P160原题
#include <cstdio>
#include <iostream>
#include <string.h>
#include <string>
#include <map>
#include <queue>
#include <deque>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <stack>
#include <iomanip>
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
#define MAX 2000
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
const int maxn=100005,inf=0x3f3f3f3f;
const ll llinf=0x3f3f3f3f3f3f3f3f,mod=1e9+7;
const ld pi=acos(-1.0L);
ll a[maxn],p[maxn],r[405][405];
bool prime[MAX+5];
int num=0;
void init() {
mem0(prime);
int i,j;
for (i=2;i<=MAX;i++) {
if (!prime[i])
p[num++]=i;
for (j=0;j<num&&i*p[j]<=MAX;j++) {
prime[i*p[j]]=1;
if (i%p[j]==0) break;
}
}
}
ll fastpower(ll base,ll index) {
ll ans,now;
if (index<=0) return 1;
ans=1;
now=base;
ll k=index;
while (k) {
if (k%2) ans=ans*now;
ans%=mod;
now=now*now;
now%=mod;
k/=2;
}
return ans;
}
ll gauss(int n,int m) {
int i,j,k,l;
i=j=0;
while (i<n&&j<m) {
int q=-1;
for (k=i;k<n;k++)
if (r[k][j]) {
q=k;break;
}
if (q==-1) {
j++;continue;
}
for (k=j;k<m;k++) swap(r[i][k],r[q][k]);
for (k=i+1;k<n;k++) {
if (r[k][j])
for (l=j;l<m;l++) r[k][l]^=r[i][l];
}
i++;
}
return i; //有界变量数量即为消元次数
}
int main() {
int cas,cnt=0;
scanf("%d",&cas);
init();
while (cas--) {
int n,i,j;
cnt++;printf("Case #%d:\n",cnt);
scanf("%d",&n);
mem0(r);
for (i=0;i<n;i++) {
scanf("%I64d",&a[i]);
for (j=0;j<num;j++) {
while (a[i]%p[j]==0) {
a[i]/=p[j];
r[j][i]^=1;
}
}
}
ll w=n-gauss(num,n);
ll ans=fastpower(2,w)-1;
printf("%I64d\n",ans);
}
return 0;
}