山东省ACM竞赛(2015)---H - Square Number

Square Number

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

In mathematics, a square number is an integer that is the square of an integer. In other words, it is the product of some integer with itself. For example, 9 is a square number, since it can be written as 3 * 3.
Given an array of distinct integers (a1, a2, ..., an), you need to find the number of pairs (ai, aj) that satisfy (ai * aj) is a square number.
 

输入

 The first line of the input contains an integer T (1 ≤ T ≤ 20) which means the number of test cases.
Then T lines follow, each line starts with a number N (1 ≤ N ≤ 100000), then N integers followed (all the integers are between 1 and 1000000).
 

输出

 For each test case, you should output the answer of each case.

示例输入

1   
5   
1 2 3 4 12

示例输出

2


AC CODE:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <set>
#define AMAX 1000001
#define BMAX 1001
using namespace std;
int kPrimeBase_1000=0;
int PrimeBase_1000[BMAX];
int PrimeDisolve_list[AMAX];
int s[100001];
void prime()
{
    int i,j;
    for(j=2; j<BMAX; j++)
    {
        for(i=0; i<kPrimeBase_1000; i++)
        {
            if(j%PrimeBase_1000[i]==0)break;
        }
        if(i==kPrimeBase_1000)PrimeBase_1000[kPrimeBase_1000++]=j;
    }
}
int main()
{
    prime();
    int i,j;
    int base,ba;
    for(i=1; i<AMAX; i++)
        PrimeDisolve_list[i]=i;
    for(i=0; i<kPrimeBase_1000; i++)
    {
        base=PrimeBase_1000[i]*PrimeBase_1000[i];
        j=base;
        while(j<AMAX)
        {
            while(PrimeDisolve_list[j]%base==0)
                PrimeDisolve_list[j]/=base;
            j+=base;
        }
    }
    int T;
    int n;
    int t,time;
    long long sum;
    cin>>T;
    while(T--)
    {
        sum=0;
        multiset<int> st;
        cin>>n;
        for(i=0; i<n; i++)
        {
            cin>>s[i];
            t=PrimeDisolve_list[s[i]];
            time=st.count(t);
            sum+=time;
            st.insert(t);
        }
        cout<<sum<<endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值