Square Number & Cube Number

Square Number:

Description

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.

Input

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).

Output

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

Sample Input

1   
5   
1 2 3 4 12

Sample Output

2

Cube Number:

Description

In mathematics, a cube number is an integer that is the cube of an integer. In other words, it is the product of some integer with itself twice. For example, 27 is a cube number, since it can be written as 3 * 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 cube number.

Input

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).

Output

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

Sample Input

1   
5   
1 2 3 4 9

Sample Output

2

题意:

给你一列数,问两个数相乘组成(平方数&立方数)的种数有多少

题解:

对于平方数来说,每个平方数都能分解成若干质数的平方,所以枚举所有的素数,如果出现偶次幂直接忽略,若是奇数次幂,打表统计;

对于立方数来说,每个平方数都能分解成若干质数的立方,枚举所有的素数,若出现三次幂忽略,然后剩下的有两种情况:

例如剩下的一个数可以分解成三个质数a*b^2(a,b均为质数),那么他只能和a^2*b匹配;

代码(square number):

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define is_lower(c) (c>='a' && c<='z')
#define is_upper(c) (c>='A' && c<='Z')
#define is_alpha(c) (is_lower(c) || is_upper(c))
#define is_digit(c) (c>='0' && c<='9')
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define IO ios::sync_with_stdio(0);\
    cin.tie(0);\
    cout.tie(0);
#define For(i,a,b) for(int i = a; i <= b; i++)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
const ll inf=0x3f3f3f3f;
const double EPS=1e-10;
const ll inf_ll=(ll)1e18;
const ll mod=1000000007LL;
const int maxn=1000000;
bool vis[maxn+1000000];
int prime[maxn],prime1[maxn];
bool isprime[maxn+5];
int cnt[maxn+5];
int num = 0;
void getprime()
{
    memset(vis, false, sizeof(vis));
    int N = sqrt(maxn);
    for (int i = 2; i <= N; ++i)
    {
        if ( !vis[i] )
        {
            prime[++num] = i;
            prime1[num] = i*i;
        }
        for (int j = 1; j <= num && i * prime[j] <= N ;  j++)
        {
            vis[ i  *  prime[j] ]  =  true;
            if (i % prime[j] == 0) break;
        }
    }
}
int main()
{
    int T;
    cin>>T;
    getprime();
    while(T--)
    {
        int x;
        memset(cnt,0,sizeof(cnt));
        cin>>x;
        For(i,1,x)
        {
            int xx;
            cin>>xx;
            for(int j = 1; xx>=prime1[j]&&j<=num; j++)
            {
                while(xx%prime1[j]==0)
                    xx/=prime1[j];
            }
            cnt[xx]++;
        }
        ll ans = 0;
         For(i,1,maxn-1)
        if(cnt[i])
            ans+= cnt[i]*(cnt[i]-1)/2;
        cout<<ans<<endl;
    }
    return 0;
}

Cube Number:

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define is_lower(c) (c>='a' && c<='z')
#define is_upper(c) (c>='A' && c<='Z')
#define is_alpha(c) (is_lower(c) || is_upper(c))
#define is_digit(c) (c>='0' && c<='9')
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define IO ios::sync_with_stdio(0);\
    cin.tie(0);\
    cout.tie(0);
#define For(i,a,b) for(int i = a; i <= b; i++)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
const ll inf=0x3f3f3f3f;
const double EPS=1e-10;
const ll inf_ll=(ll)1e18;
const ll mod=1000000007LL;
const int maxn=1000000;
bool vis[maxn+1000000];
ll prime[maxn],prime_2[maxn],prime_3[maxn];
bool isprime[maxn+5];
ll cnt[maxn+5];
int num = 0;
void getprime()
{
    memset(vis, false, sizeof(vis));
    int N = maxn;
    for (int i = 2; i <= N; ++i)
    {
        if ( !vis[i] )
        {
            prime[++num] = i;
            prime_2[num] = i * i;
            prime_3[num] = i * i * i;
        }
        for (int j = 1; j <= num && i * prime[j] <= N ;  j++)
        {
            vis[ i  *  prime[j] ]  =  true;
            if (i % prime[j] == 0) break;
        }
    }
}
int main()
{
    int T;
    cin>>T;
    getprime();
    while(T--) {
        int x;
        int res = 0;
        cin >> x;
        memset(cnt, 0, sizeof(cnt));
        for(int i = 1,xx; i <= x && cin>>xx; i++) {
            for(int j = 1; j <= num && xx >= prime_3[j]; j++)
                if(xx % prime_3[j]==0)
                    while(xx % prime_3[j] == 0)
                        xx /= prime_3[j]; 
            cnt[xx]++;
            if(xx == 1) {
                res += cnt[xx] - 1;
                continue;
            }
            int tem = 1;
            for(int j = 1; j <=num && xx >= prime_2[j]; j++)
                if(xx % prime_2[j] == 0)
                    while( xx % prime_2[j] == 0) {
                        xx /= prime_2[j];
                        tem *= prime_2[j];
                    }
            if(xx <= 1000) { // 大于1000的素数的平方一定不存在;
                xx = sqrt(tem) * xx * xx; // 和另一半匹配,一定不大于maxn 加条件判断; 
                if(xx < maxn)
                    res += cnt[xx];
            }
        }
        cout << res << endl;
    }
    return 0;
}  

 

 

posted @ 2018-03-28 11:23  GHzz  阅读(392)  评论(0编辑  收藏  举报