首页 > 其他分享 >D - Square Pair

D - Square Pair

时间:2024-08-11 22:48:54浏览次数:10  
标签:Square 200005 int st next low Pair now

原题链接

题解

多想几种暴力

1.遍历所有数对: \(O(n^2)\)

2.求有多少数对其乘积为平方数 \(\to\) 求有多少平方数能被数对乘积: \(O(n^2)\)

3.如果两个数的乘积为平方数,代表他们的质因数,要么都是奇数,要么都是偶数 : \(O(?)\)

4.如果 \(a \times b\) 是完全平方数,代表 \(a\times b\) 的质因子都是偶数,所以如果 \(a,b\) 的质因子为偶数,可以去掉,对答案没有影响

这样下来,去掉了所有偶数质因子的 \(a'\) 和 \(b'\),如果他们的乘积还是平方数,当且仅当 \(a',b'\) 具有的质因子一样,由于我们只需要每个数具有的奇数质因子,所以我们将所有的奇数质因子个数变为1,偶数变为0

所以,我们可以对所有数去除质因子,然后统计相同数数对

code

#include<bits/stdc++.h>
using namespace std;
/*
#define double long double
#define lowbit(x) ((x)&(-x))
const int inf=1e18;

const int N=4e5;

int inv(int x)
{
    return qpow(x,mod-2);
}
int fa[2000005];
int finds(int now){return now==fa[now]?now:finds(fa[now]);}

vector<int> G[200005];

int dfn[200005],low[200005];
int cnt=0,num=0;
int in_st[200005]={0};
stack<int> st;
int belong[200005]={0};

void scc(int now,int fa)
{
    dfn[now]=++cnt;
    low[now]=dfn[now];
    in_st[now]=1;
    st.push(now);

    for(auto next:G[now])
    {
        if(next==fa) continue;

        if(!dfn[next])
        {
            scc(next,now);
            low[now]=min(low[now],low[next]);
        }
        else if(in_st[next])
        {
            low[now]=min(low[now],dfn[next]);
        }
    }

    if(low[now]==dfn[now])
    {
        int x;
        num++;
        do
        {
            x=st.top();
            st.pop();
            in_st[x]=0;
            belong[x]=num;
        }while(x!=now);
    }
}

*/

#define int long long
vector<int> prime;
bool mark[200005]={0};
int fac[200005]={0};
void shai()
{
    for(int i=2;i<=200000;i++)
    {
        if(!mark[i])
        {
            fac[i]=i;
            prime.push_back(i);
        }

        for(auto it:prime)
        {
            if(it*i>200000) break;
            mark[it*i]=1;
            fac[it*i]=it;
            if(it%i==0) break;
        }
    }
}
int qpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1) res=res*a;
        a=a*a;
        n>>=1;
    }
    return res;
}
int a[200005],vis[200005]={0};
void solve()
{
    int n;
    cin>>n;

    int ans=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0)
        {
            ans+=n-i;
            continue;
        }
        int tem=a[i];

        while(tem!=1)
        {
            int f=fac[tem];
            int cnt=0;
            while(tem!=1&&fac[tem]==f)
            {
                cnt++;
                tem/=fac[tem];
            }
            if(cnt%2==0)
            {
                a[i]/=qpow(f,cnt);
            }
            else a[i]/=qpow(f,cnt-1);
        }
        //printf("i:%d  a:%d\n",i,a[i]);
        ans+=vis[a[i]];
        vis[a[i]]++;
    }

    cout<<ans;
}
signed main()
{
    shai();
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int TT=1;
    //cin>>TT;
    while(TT--) solve();
    return 0;
}


标签:Square,200005,int,st,next,low,Pair,now
From: https://www.cnblogs.com/pure4knowledge/p/18354067

相关文章

  • CF1969F-Card Pairing【dp】
    正题题目链接:https://www.luogu.com.cn/problem/CF1969F题目大意有一个长度为\(n\)的卡牌序列\(a\),每张牌是\(1\simk\)中的一个类型,你先取出序列里的前\(k\)张牌,然后你每次可以选择两张牌打出然后再抽两张牌,如果类型一样就加一分。求打完所有牌你最多能加多少分。......
  • Local All-Pair Correspondence for Point Tracking 中英对照
    论文来自:https://ku-cvlab.github.io/locotrack/LocalAll-PairCorrespondenceforPointTracking局部全对应对点跟踪SeokjuCho\({}^{1}\),JiahuiHuang\({}^{2}\),JisuNam\({}^{1}\),HonggyuAn\({}^{1}\),Seungryong\({\mathrm{{Kim}}}^{1,\dagger}\),......
  • 如何使用新版本抓取foursquare?
    我正在尝试使用此代码从foursquare中抓取场地defgetNearbyVenues(names,latitudes,longitudes,radius=500):venues_list=[]forname,lat,lnginzip(names,latitudes,longitudes):print(name)#CreatetheAPIreques......
  • 洛谷P1209修理牛棚 Barn Repair
    [USACO1.3]修理牛棚BarnRepair题目描述在一个月黑风高的暴风雨夜,FarmerJohn的牛棚的屋顶、门被吹飞了好在许多牛正在度假,所以牛棚没有住满。牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。有些牛棚里有牛,有些没有。所有的牛棚有相同的宽度。宽度为1自门遗失以后......
  • LeetCode | 977 SquaresOfASortedArray
    https://github.com/dolphinmind/datastructure/tree/datastructure-array主类packagecom.github.dolphinmind.array.binarysearch;/***@authordolphinmind*@ClassNameSquaresOfASortedArray*@description977.有序数组的平方*分析:有移除元素{......
  • Laconic Private Set-Intersection From Pairings (2022)
    LaconicPrivateSet-IntersectionFromPairings(2022)论文地址:https://eprint.iacr.org/2022/529.pdf代码地址:https://github.com/relic-toolkit/relic/tree/main/demo/psi-client-server代码运行参考:RELIC库学习Laconic算法介绍Laconic适用于算力和存储受限的客户端......
  • 【逆运动学2】damped least squares method阻尼最小二乘法
    逆运动学 逆运动学,就是从操作空间的endeffectorpositionandorientation,求关节空间的jointposition的问题。在之前的文章,我们简单提到求逆运动学解的解析解法和优化解法,详细讲解了用逆瞬时(或说微分)运动学即雅可比矩阵法迭代求解逆运动学的方法。这篇文章我们继续讲雅可比矩......
  • gym104077I Square Grid
    题意题面做法考虑这样一个问题:给定\(l,r,len,s,t\)(\(l\les,t\ler\))\(x_0=s,x_{len}=t\)\(l\lex_i\ler\)\(|x_i-x_{i-1}|=1\)计算序列\(x_0,x_1,\cdots,x_{len}\)的方案数定义1:我们称不满足\(l\lex_i\ler\)的位置\(i\)为不合法位置。定义2:对于\(x_i<l\)的,我们令......
  • 如何使用 Python 从 Square 中的创建客户方法中检索客户 ID
    我正在square创建一个客户并得到如下结果。我需要的是获取客户的id。我的代码:fromsquare.clientimportClientclient=Client(access_token=settings.SQUARE_ACCESS_TOKEN,environment=settings.SQUARE_ENVIRONMENT,)api_customers=client.customers......
  • 使用 Python 中的 Square API 检索客户 ID
    我正在为Square开发一个客户创建表单,它将创建一个客户,然后立即检索他们的ID以在程序中进一步使用。但是,我不知道如何使用API来过滤使用list_customers命令返回的数据。我找到了这篇文章:HowtoretrievecustomeridfromcreatecustomermethodinSquareusing......