CF1247D/1248B WAon #6 求条
  • 板块学术版
  • 楼主Ryanhao
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/28 17:50
  • 上次更新2025/7/28 19:03:07
查看原帖
CF1247D/1248B WAon #6 求条
741633
Ryanhao楼主2025/7/28 17:50

rt.

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;

int a[100005],cnt[325];
bool vis[100005];

int main() {
	int n,k; scanf("%d%d",&n,&k);
	for (int i = 1; i <= n; i++) {
		memset(cnt,0,sizeof cnt);
		int x; scanf("%d",&x); int y = x;
		for (int j = 2; j*j <= y; j++) {
			while(x%j == 0) {
				cnt[j]++;
				x /= j;
			}
			cnt[j] %= k;
		}
		if (x > 320) continue;
		else if (x > 1) cnt[x]++;
		x = 1;
		for (int j = 2; j <= 320; j++) while(cnt[j]--) x *= j;
		a[x]++;
	}
	ll ans = 0;
	for (int i = 1; i <= 100005; i++) {
		if (!a[i] || vis[i]) continue;
		memset(cnt,0,sizeof cnt);
		int x = i;
		for (int j = 2; j*j <= i; j++) {
            while(x%j == 0) {
                cnt[j]++;
                x /= j;
            }
            cnt[j] %= k;
			cnt[j] = k-cnt[j];
			cnt[j] %= k;
        }
		if (x > 1 && x <= 320) cnt[x] = k-1;
		x = 1;
		for (int j = 2; j <= 320; j++) while(cnt[j]--) x *= j;
		if (x > 1e5 || !a[x] || vis[x]) continue;
		if (i == x) ans += 1ll*a[i]*(a[x]-1)/2;
		else ans += 1ll*a[i]*a[x];
		vis[i] = vis[x] = 1;
	}
	printf("%lld\n",ans);
	return 0;
}
2025/7/28 17:50
加载中...