Square Number-3258拆平方

来源:互联网 发布:oppo应用分身软件 编辑:程序博客网 时间:2024/05/22 00:23

题意:

询问给定的数字 有多少对两两相乘是一个平方数。

思路:

n=x*x*y

m=z*z*y

n*m =x*x *z*z *y *y

因此只要是一次方相乘的数字相同就是一对。  例如 32= 2*2 *  2*2 *   2      8= 2*2  *2 相乘就是一组满足条件的解。

之后从抽象出来的数组中求组合Ca[i]  2


#include <iostream>#include <cstdio>#include <queue>#include <map>#include <cmath>#include <algorithm>#include <stack>#include <cstring>using namespace std;int s[1000005];int a[1000005];int prime[10005];int main(){    int cnt=0;    for(int i=2;i<=1000;i++)    {        for(int j=2;j*j<=i;j++)        {            if( i%j==0 )            {                s[i]=1;                break;            }        }        if(!s[i])            prime[++cnt]=i;    }    int t;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        int n;        scanf("%d",&n);        int res=0;        for(int i=1;i<=n;i++)        {            int t;            scanf("%d",&t);            for(int j=1;j<=cnt;j++)            {                int k=prime[j]*prime[j];                if(t<k) break;                while(t%(k)==0)                {                    t/=k;                }            }            a[t]++;        }        for(int i=1;i<=1000000;i++)        {            res+=(a[i]*(a[i]-1))/2;        }        printf("%d\n",res);    }    return 0;}


0 0