CF980D Perfect Groups
可以先把平方因子全部除掉,然后如果剩下的是相等的说明乘积为平方数
注意0特殊考虑一下
n^2枚举区间就好了
code:
#include<bits/stdc++.h>
#define N 10005
using namespace std;
int get(int x) {
for(int i = 2; i * i <= abs(x); i ++) {
while(x % (i * i) == 0) x /= i * i;
}
return x;
}
int n, a[N], ans[N], b[N], aa[N];
map<int, int> mp;
int main() {
scanf("%d", &n);
int gs = 0;
for(int i = 1; i <= n; i ++) {
scanf("%d", &a[i]), a[i] = get(a[i]); aa[i] = a[i];
if(mp[a[i]]) a[i] = mp[a[i]];
else mp[a[i]] = ++ gs, a[i] = gs;
}
for(int i = 1; i <= n; i ++) {
int cnt = 0;
for(int j = i - 1; j <= n; j ++) b[a[j]] = 0;
for(int j = i; j <= n; j ++) {
if(!aa[j]) {
if(!cnt) ans[1] ++;
else ans[cnt] ++;
} else {
if(!b[a[j]]) cnt ++, b[a[j]] = 1;
ans[cnt] ++;
}
}
}
for(int i = 1; i <= n; i ++) printf("%d ", ans[i]);
return 0;
}