CF980D Perfect Groups

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;
}
posted @ 2020-11-06 11:14  lahlah  阅读(23)  评论(0编辑  收藏  举报