题解
2026-06-03 20:14:07
发布于:浙江
3阅读
0回复
0点赞
首发题解,庆祝一下
大家好,我是энтджей,今天是我2026年第十五次正式发题解!
能不能点个赞
首先简化题意:
- 就是给定一个数组,求 的个数
然后就是写代码
-
处理输入(read):
- 正常输入
-
核心部分(process):
- 暴力枚举,会TLE
- 那么只能运用一些不同于枚举的方法了:
- 利用完全平方数的特点:指数都为偶数
- 那么我们只需要记录底数出现的奇偶性(利用$ ^= 1$),看看这种情况出现的次数,算出一共有多少种不同的 满足
- 但为什么记录底数出现的奇偶性就彳亍了呢?
- 来分析完全平方数的特点:
- 设一个完全平方数为,则的两个且仅这两个相同的因数为,设为,即
- 则 :
- 一个数乘以2一定是偶数(),所以完全平方数仅仅需要看TA的所有(没意识到,错了好几次)质因数的指数是否都为偶数。反过来,如果一个数的所有质因子指数都是偶数,那它也一定是完全平方数(把每个指数除以2,就得到平方根)。
- 来分析完全平方数的特点:
-
最后输出(write):
- 正常输出
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1024 + 10;
int n;
int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; //数据说明了到30就停鸟
int cnt[N];
int ans = 0;
void ReadProcess() {
cin >> n;
int mask = 0;
cnt[0] = 1;
for(int i = 1; i <= n; i++){
int x;
cin >> x;
for(int j = 0; j < 10; j++) {
int p = primes[j];
int exponent = 0;
while(x % p == 0){
exponent ^= 1;
x /= p;
}
if(exponent) {
mask ^= (1 << j);
}
}
ans += cnt[mask];
cnt[mask]++;
}
}
void write() {
cout << ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
ReadProcess();
write();
return 0;
}
//代码蛮短的
🎉完结撒花🎉
怎么感觉这篇又长又短捏?
这里空空如也






有帮助,赞一个