Atcoder ABC342D Square Pair 題解 [ 綠 ] [ 數論 ] [ 唯一分解定理 ]

KS_Fszha發表於2024-12-05

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

引理

\(x=y^2\times z\),且 \(x\) 是完全平方數,那麼 \(z\) 也一定是完全平方數。

證明可以用唯一分解定理證,每次把偶數次冪的數消掉,那麼剩下的一定是一堆次數為 \(1\) 的項乘在一起。而一個數是完全平方數的充分必要條件就是沒有任何一個剩下次數為 \(1\) 的項。

正解

我們可以對於每一個數,單獨把它剩下的一次項的乘積乘起來。因為那些完全平方因子是不影響最終答案的。

那麼兩個數的乘積要成完全平方數,這兩個數剩下的一次項就都要完全相同,這個體現在它們剩下的一次項的乘積相同。

因此記錄下每個數剩下一次項的乘積,開桶依次匹配即可。

時間複雜度 \(O(n \sqrt{n})\)

程式碼

注意特判 \(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;
}

相關文章