for(int j=2;j*j<=x;j++){
int cnt=0;
while(x%j==0) x/=j,cnt^=1;
hsh+=pw(2333,mp[j])*cnt;
}
为什么这么写会tle
for(int j=2;j*j<=x;j++){
int cnt=0;
while(x%j==0) x/=j,cnt^=1;
if(cnt) hsh+=pw(2333,mp[j]);
}
但改成这样就好了
这个是完整代码
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define rep(x,a,b) for(int x=(a);x<=(b);x++)
#define per(x,a,b) for(int x=(a);x>=(b);x--)
#define scf(a) scanf("%d",&a)
#define scfll(a) scanf("%lld",&a)
#define scfdb(a) scanf("%lf",&a)
#define ptf(a) printf("%d",a)
#define ptfll(a) printf("%lld",a)
#define ptfdb(x,a) printf("%x.lf",a)
#define ptfsp(a) printf("%d ",a)
#define ptfllsp(a) printf("%lld ",a)
#define ptfdbsp(x,a) printf("%x.lf ",a)
#define pli(a,b) make_pair(a,b)
#define pb push_back
#define el puts("")
#define pi 3.1415926
using namespace std;
const ll mod=1e9+7;
const int maxn=1e7+5;
int mp[maxn];
int prime[maxn],num=0;
bool vis[maxn];
void init(int n){
for(int i=2;i<=n;i++){
if(!vis[i]) prime[++num]=i,mp[i]=num;
for(int j=1;j<=num;j++){
if(i*prime[j]>n) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
ull pw(ull a,ull n){
ull ans=1,base=a;
while(n){
if(n&1) ans=ans*base;
base=base*base;
n>>=1;
}
return ans;
}
ull a[200005];
set<ull>st;
int main(){
init(1e7);
ull aa=3;
aa=aa*0;
cout<<aa;
// cout<<num<<endl;
int T;scf(T);
while(T--){
int n;scf(n);
int k;scf(k);
rep(i,1,n){
int x;scf(x);
ull hsh=0;
for(int j=2;j*j<=x;j++){
int cnt=0;
while(x%j==0) x/=j,cnt^=1;
if(cnt) hsh+=pw(2333,mp[j]);
}
if(x!=1) hsh+=pw(2333,mp[x]);
a[i]=hsh;
}
int ans=0;
st.clear();
rep(i,1,n){
if(st.count(a[i])){
ans++;
st.clear();
}
st.insert(a[i]);
}
ptf(ans+1);el;
}
}