“浪潮杯”山东省第六届ACM大学生程序设计竞赛 H

题意是给你n个数,让你求两个数相乘是平方数的对数。
直接先打一个素数表,然后把输入的每个数都从中取掉含有的平方数。得到一个新的数,在这些数中相互比较,如果两个数相等,那么代表这两个数的乘积为平方数。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define LL long long int
const int inf = 0x3f3f3f3f;
int a[100100];
int prime[1000100];
int pri[1000100];
int s[1000100];
map<int, int>mp;
map<int, int>::iterator it;
void init()
{
    memset(prime, 0, sizeof(prime));
    for (int i = 2; i < 1000100; i++)
    {
        if (!prime[i])
        for (int j = 2 * i; j < 1000100; j += i)
            prime[j] = 1;
    }
    int cmp = 0;
    for (int i = 2; i < 1000100; i++)
    if (!prime[i])
        pri[cmp++] = i;
}
int main()
{
    int T;
    int n;
    cin >> T;
    init();
    while (T--)
    {
        scanf("%d", &n);
        //mp.clear();
        memset(s, 0, sizeof(s));
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            int cmp = 0;
            while (a[i] >= pri[cmp] * pri[cmp])
            {
                if (a[i] % (pri[cmp] * pri[cmp]) == 0)
                    a[i] /= pri[cmp] * pri[cmp];
                else
                    cmp++;
            }
            s[a[i]]++;
        }
        int res = 0;
        for (int i = 0; i < 1000100;i++)
        if (s[i] >= 2)
            res += (s[i] - 1)*s[i] / 2;
        printf("%d\n", res);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/b_r_e_a_d/article/details/80330775