#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#include<map>
typedef long long ll;
const ll N=1e7;
ll book[N+10],prime[N+10],cnt=0;
//一个数 质因数分解 如果他所有的约数的指数都是偶数的话 那他一定是某个数的平方
在这里判断两个数相乘是不是某个数的平方 我们将每个数 约数的指数为奇数的约数 相乘存到map里 如果在后面的数里也有相同的 那这两个数相乘肯定是某个数的平方
这样这段子序列就不合适了 将map清空 再次从下一个开始
void init()
{
int i,j;
for(i=2; i<=N; i++)
{
if(!book[i])
{
prime[cnt++]=i;
// printf("%d\n",prime[cnt-1]);
for(j=2; j*i<=N; j++)
book[i*j]=1;
}
}
}
int getans(int x)
{
if(x==1)
{
return 1;
}
int i,j,ans=0,sum=1;
for(i=0; i<cnt&&prime[i]*prime[i]<=x; i++)
{
if(x%prime[i]==0)
{
ans=0;
while(x%prime[i]==0)
{
x=x/prime[i];
// printf("####### %d\n",prime[i]);
ans++;
}
if(ans%2!=0)
sum*=prime[i ];
// printf("@@@@@@ %d\n",sum);
}
}
if(x>1)
sum=sum*x;
return sum;
}
int main()
{
int i,j,k,m,n,t;
init();
cin>>t;
while(t--)
{
map<int,int>mp;
int ans=1;
cin>>n>>k;
for(i=1; i<=n; i++)
{
cin>>m;
int w=getans(m);
// printf("+++++ %d\n",w);
if(mp[w])
{
// printf("**** %d\n",m);
ans++;
mp.clear();
}
mp[w]++;
}
cout<<ans<<endl;
}
return 0;
}
CodeForces - 1497E1
最新推荐文章于 2024-06-17 20:25:43 发布