Language: C++

#include <bits/stdc++.h>
#define rep(i,N) for(int i=0;i<N;i++)
#define rep2(i,N) for(int i=1;i<=N;i++)
using namespace std;
long long  INF=1000000000000000000;
long long mod=1000000007;
using namespace std;

//Cooley-Tukey FFT algorithm
vector<complex<double>> fft(vector<complex<double>>a,bool inverse=false){
    int n=a.size();
    int h=0;        //h=log_2(n)
    for(int i=0;1<<i<n;i++)h++;
    //バタフライ演算用の配置入れ替え
    for(int i=0;i<n;i++){
        int j=0;
        for(int k=0;k<h;k++) j|=(i>>k&1)<<(h-1-k);
        if(i<j)swap(a[i],a[j]);
    }
    
    //バタフライ演算
    for(int b=1;b<n;b*=2){
        //第 log_2(b)+1段
        //ブロックサイズ=b*2
        
        for(int j=0;j<b;j++){
            //ブロック内j個目
            //重み　w=(1の原始 2b 乗根　のj乗)
        complex<double> w=polar(1.0,-(2*M_PI)/(2*b)*j*(inverse ? 1:-1));

        for(int k=0;k<n;k+=b*2){
            //kを先頭とするブロック
            complex<double> s=a[j+k];       //前
            complex<double> t=a[j+k+b]*w;   //後
            a[j+k]=s+t;
            a[j+k+b]=s-t;
            }
        }
    }
    if(inverse){
        for(int i=0;i<n;i++)a[i]/=n;
    }
    
    return a;
}

//関数のオーバーロード
vector<complex<double>> fft(vector<double> a,bool inverse=false){
    vector<complex<double>> a_complex(a.size());
    rep(i,a.size())a_complex[i]=complex<double>(a[i],0);
    return fft(a_complex,inverse);
}

vector<double> convolve(vector<double> a,vector<double> b){
    int s=a.size()+b.size()-1;  //畳み込み結果のサイズ
    int t=1;                    //FFTに使う配列のサイズ
    while(t<s)t*=2;
    a.resize(t);                //FFTするためにリサイズ
    b.resize(t);                //FFTするためにリサイズ
    vector<complex<double>> A=fft(a);
    vector<complex<double>> B=fft(b);

    for(int i=0;i<t;i++){
        A[i]*=B[i];             //畳み込み結果のFFT結果を得る
    }
    A=fft(A,true);              //IFFTで畳み込み結果を得る
    a.resize(s);
    for(int i=0;i<s;i++)a[i]=A[i].real();   //実部が答え
    
    return a;
}

int main(){

long long  N,M;
cin>>N>>M;

vector<int>A(N);

rep(i,N)cin>>A[i];

vector<double> num(200001,0);
rep(i,N)num[A[i]]+=1;

vector<double>ans=convolve(num,num);

vector<long long > B(200001);

rep(i,200001)B[i]=long long (0.5+ans[i]);

long long Answer=0;
for(int i=200000;i>0;i--){
    Answer+=i*min(( B[i],M);
    M=max((M-B[i]),(long long )0);
    if(M==0)break;
}

cout<<Answer<<endl;

return 0;

}
/*
5 3
10 14 19 34 33

202

9 14
1 3 5 110 24 21 34 5 3

1837

9 73
67597 52981 5828 66249 75177 64141 40773 79105 16076

8128170



7




56 


715
*/


Compiler output:
a.cc: In function 'int main()':
a.cc:89:19: error: expected primary-expression before 'long'
   89 | rep(i,200001)B[i]=long long (0.5+ans[i]);
      |                   ^~~~
a.cc:93:24: warning: ignoring return value of 'std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = long long int; _Alloc = std::allocator<long long int>; reference = long long int&; size_type = long unsigned int]', declared with attribute 'nodiscard' [-Wunused-result]
   93 |     Answer+=i*min(( B[i],M);
      |                        ^
In file included from /usr/include/c++/14/vector:66,
                 from /usr/include/c++/14/functional:64,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:53,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_vector.h:1128:7: note: declared here
 1128 |       operator[](size_type __n) _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~
a.cc:93:28: error: expected ')' before ';' token
   93 |     Answer+=i*min(( B[i],M);
      |                  ~         ^
      |                            )