首页 > 其他分享 >AtCoder Beginner Contest 342

AtCoder Beginner Contest 342

时间:2024-02-26 12:56:57浏览次数:17  
标签:AtCoder 平方 选出 Beginner int 元素 完全 因子 342

D.Square Pair

给你一个数组,最多2e5个元素,每个元素的范围是0到2e5
问选出两个元素,乘积为完全平方数的情况有多少?(任选a[i] a[j],且满足i < j)

一种思路是用map记录数组的元素,选出一个元素 x 后,枚举所有完全平方数,如果完全平方数可以整除选出的这个元素且整除的结果 y 在map中,那就满足题意,只需要保证让x < y 就可以避免重复计数.但是这样时间复杂度太高了.

注意到这个元素如果他的因子是完全平方数,那么这个因子对最终乘以另一个数是否为完全平方数并不会造成影响.可以直接把这个因子去掉.最终剩下的因子都是奇数次方.那当且仅当一个数奇数次的因子与挑选出的另一个数的奇数次因子完全一样就能构成完全平方数了.而我们不需要真的挨个判断因子,只需要判断因子的乘积就可以了.(为了避免其他情况,我们只挑选质因子.并且根据唯一分解定理).

最后统计计数就可以了.注意 0 也要算.

#include<bits/stdc++.h>

using namespace std;

#define int long long

void solve()
{
    int n;
    cin>>n;
    vector<int>a(n);
    map<int,int>m;
    int res = 0;

    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        
        for(int j=2;j<=a[i]/j;j++)
        {
            while(a[i]%(j*j)==0)
            {
                a[i]/=(j*j);
            }
        } 
        // cout<<a[i]<<' ';
        m[a[i]]++;
    }    
    for(auto[x,y]:m)
    {
        if(!x)
        {
            // res+=n-y;
            continue;
        }
        else
        {
            res+=m[0]*y;
            res+=y*(y-1)/2;
        }
    }
    res+=m[0]*(m[0]-1)/2;
    cout<<res;
}

signed main()
{
    int T = 1;
    // cin>>T;

    while(T--)
        solve();

    return 0;
}

标签:AtCoder,平方,选出,Beginner,int,元素,完全,因子,342
From: https://www.cnblogs.com/oijueshi/p/18034055

相关文章

  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)D - Only one of two
    目录链接题面题意题解代码总结链接D-Onlyoneoftwo题面题意求第\(k\)个只能被\(N\)或\(M\)整除的数题解\([1,x]\)中的能被\(n\)整除的数有\(\lfloor\frac{x}{n}\rfloor\)个\([1,x]\)中的能被\(m\)整除的数有\(\lfloor\frac{x}{m}\rfloor\)个\([1,x]\)中的能被\(n\)......
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)
    HUAWEIProgrammingContest2024(AtCoderBeginnerContest342)A-Yay!代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=p......
  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......
  • AtCoder Beginner Contest 342
    A-Yay!(abc342A)题目大意给定一个字符串,两个字符,其中一个只出现一次,找出它的下标。解题思路看第一个字符出现次数,如果是\(1\)则就是它,否则就是不是它的字符。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){io......
  • At-abc342
    AtCoderBeginnerContest342(已更新:CD)C似曾相识的经典映射题……而只会map的蒟蒻成功又被卡住了简单的用map映射无法处理如r->a,a->r这样的多重映射,应该在先存下原本的信息,再作映射写到这突然悟了……再改改果然是没有悟一点(⊙﹏⊙),由于只处理26个字母,每次修改实时更......
  • ABC342总结
    ABC342总结A+B+C+D虽然有奖,但是一无所获,都排到2000名左右了。赛时快速通过前四题,但是第五题被题目迷惑,第六题思路混乱,第七题本来是能力范围之内(数据结构是chnoier的特长),但是没读题。E一个最短路,这是有提示的,但是有一个迷惑信息。题目让我们求从A最晚出发的时间能到达N,其......
  • Atcoder ABC 342 全题解
    闲话当我还是一个只会AB的小蒟蒻时,由于不会C又看不懂官方题解,只好看网上的题解。结果:ABC签到题不讲AB对着题意模拟即可。A有个好玩的做法,先看前两个,如果不同跟第三个比较,如果相同看后面哪个字母跟第一个不一样。C由于是将所有的$c_i$替换,所以可得同一个字母最......
  • AtCoder WTF 2019 B Multiple of Nine/南外集训 2024.2.23 T1
    给定\(q\)个区间\(\{[l_i,r_i]\}\),计算满足条件的长度为\(n\)的十进制数码串\(S\)的个数\(\bmod10^9+7\):\(\foralli\in[1,q],num(S[l_i,r_i])\equiv0\pmod9\)。其中\(num(T)\)表示数码串\(T\)代表的整数,\(T[a,b]\)表示子串\(T_aT_{a+1}\dotsT_b\)......
  • 山海经&&Atcoder Alternating String (线段树)
    前言:为什么把他们放在一起?因为我发现把pushup向上回溯放结构体类型函数里比较方便并且这两题确实也有相同思想山海经这题分三种情况左子树前缀和+右子树前缀和2.右子树后缀和与右总区间+左子树3.左区间最大子段与右区间最大子段与左后缀与右前缀特别要注意......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)
    ToyotaProgrammingContest2024#2(AtCoderBeginnerContest341)A-Print341代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingp......