Atcoder ABC342D Square Pair 题解 [ 绿 ] [ 数论 ] [ 唯一分解定理 ]

Square Pair:唯一分解定理好题。

引理

x=y2×z,且 x 是完全平方数,那么 z 也一定是完全平方数。

证明可以用唯一分解定理证,每次把偶数次幂的数消掉,那么剩下的一定是一堆次数为 1 的项乘在一起。而一个数是完全平方数的充分必要条件就是没有任何一个剩下次数为 1 的项。

正解

我们可以对于每一个数,单独把它剩下的一次项的乘积乘起来。因为那些完全平方因子是不影响最终答案的。

那么两个数的乘积要成完全平方数,这两个数剩下的一次项就都要完全相同,这个体现在它们剩下的一次项的乘积相同。

因此记录下每个数剩下一次项的乘积,开桶依次匹配即可。

时间复杂度 O(nn)

代码

注意特判 0

#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;
}
posted @   KS_Fszha  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示