找规律
例题:来自新世界
Description
1000年后的世界,只存在想象中的恐怖动物与人类展开殊死战斗。
想象力足以改变一切。
为了拯救世界,Saki酱独自开始了冒险。
现在有 N 只化鼠阻挡在她的面前,每只化鼠有属性值 Ai, Saki酱将使用技能将它们击败。
已知Saki酱的技能是群体伤害技能,每次可以击败许多化鼠, 但必须要满足的要求是:这一次施放技能所击败的化鼠中, 任意两只化鼠的属性值的乘积都是一个完全平方数。
请问,Saki酱击败所有化鼠最少要使用多少次技能?
Input
第一行为一个正整数 T (1<=T<=10), 代表有T组测试数据;
在接下来的每组数据中:
第一行为一个正整数 N(1<=N<=100000),代表有N只化鼠;
第二行有 N 个数, 第 i 个数为 Ai (1<=Ai<=100000),代表第i只化鼠的属性值为Ai。
Output
输出一行包含一个非负整数,表示Saki 酱击败所有化鼠最少要使用多少次技能。
Sample Input 1
3
5
2 5 8 5 1
4
2 4 8 16
1
3
Sample Output 1
3
2
1
Hint
第一个测试数据中:
第1次技能消灭第1、3只化鼠;第2次技能消灭第2、4只化鼠;第3次技能消灭第5只化鼠。
最少使用3次技能。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
int qq[100010],cnt[100010],ans=0;
int main()
{
int T,n,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
memset(cnt,0,sizeof(cnt));
for(i=1;i<=n;i++)
scanf("%d",&qq[i]);
for(i=1;i<=n;i++)//每个数除去自己的平方因子后,剩下的数与相同的数相乘必为平方数
for(j=2;j*j<=qq[i];j++)
while(qq[i]%(j*j)==0) qq[i]=qq[i]/(j*j);//**while勿打作if**
for(i=1;i<=n;i++)
if(!cnt[qq[i]])
{
ans++;
cnt[qq[i]]++;//最后统计有哪些数即可
}
printf("%d\n",ans);
}
return 0;
}