Atcoder ABC342D Square Pair 题解 [ 绿 ] [ 数论 ] [ 唯一分解定理 ]
Square Pair:唯一分解定理好题。
引理
若
证明可以用唯一分解定理证,每次把偶数次幂的数消掉,那么剩下的一定是一堆次数为
正解
我们可以对于每一个数,单独把它剩下的一次项的乘积乘起来。因为那些完全平方因子是不影响最终答案的。
那么两个数的乘积要成完全平方数,这两个数剩下的一次项就都要完全相同,这个体现在它们剩下的一次项的乘积相同。
因此记录下每个数剩下一次项的乘积,开桶依次匹配即可。
时间复杂度
代码
注意特判
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
const int N=200005;
ll n,a[N],tot[N];
ll ans=0;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=2;i*i<=N+100;i++)
{
for(int j=1;j<=n;j++)
{
while(a[j]%(i*i)==0&&a[j]>1)a[j]/=(i*i);
}
}
for(int i=1;i<=n;i++)
{
if(a[i])ans+=tot[0]+tot[a[i]];
else ans+=i-1;
tot[a[i]]++;
}
cout<<ans;
return 0;
}
标签:
数学,数论
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战