library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub beet-aizu/library

:heavy_check_mark: test/aoj/2560.test.cpp

Depends on

Code

// verification-helper: PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2560
// verification-helper: ERROR 1e-8

#include<bits/stdc++.h>
using namespace std;

#define call_from_test
#include "../../mod/mint.cpp"
#include "../../convolution/numbertheoretictransform.cpp"
#include "../../convolution/convolution2D.cpp"
#undef call_from_test

signed main(){
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout<<fixed<<setprecision(12);
  using ll = long long;
  using D = double;

  int n;
  cin>>n;

  vector< vector<int> > as(n,vector<int>(n));
  auto bs(as);

  int cnt=0;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      cin>>as[i][j];
      bs[n-(i+1)][n-(j+1)]=as[i][j];
      cnt+=as[i][j];
    }
  }

  NTT<1> ntt1;
  NTT<2> ntt2;
  using M1 = NTT<1>::M;
  using M2 = NTT<2>::M;
  auto tran1=[&](auto &as,bool f){ntt1.ntt(as,f);};
  auto tran2=[&](auto &as,bool f){ntt2.ntt(as,f);};

  Convolution2D<M1, decltype(tran1)> conv1(tran1);
  Convolution2D<M2, decltype(tran2)> conv2(tran2);

  vector< vector<M1> > as1(n,vector<M1>(n));
  auto bs1(as1);
  vector< vector<M2> > as2(n,vector<M2>(n));
  auto bs2(as2);
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      as1[i][j]=M1(as[i][j]);
      as2[i][j]=M2(as[i][j]);
      bs1[i][j]=M1(bs[i][j]);
      bs2[i][j]=M2(bs[i][j]);
    }
  }

  auto cs1=conv1.multiply(as1,bs1);
  auto cs2=conv2.multiply(as2,bs2);

  D dom=(D)cnt*(cnt-1)/2;
  D sum=0;
  map<ll, ll> num;
  const int S = 10000;

  auto calc=
    [&](ll a,ll b){
      const ll r01 = M2(ntt1.md).inv().v;
      b = (b - a) * r01 % ntt2.md;
      if (b < 0) b += ntt2.md;
      a = (a + b * ntt1.md);
      return a;
    };

  for(int i=0;i<(int)cs1.size();i++){
    for(int j=0;j<(int)cs1[i].size();j++){
      ll dd=(ll)(i-(n-1))*(i-(n-1))+(ll)(j-(n-1))*(j-(n-1));
      ll cc=calc(cs1[i][j].v,cs2[i][j].v);
      if(dd==0) cc-=cnt;
      if(cc==0) continue;
      num[dd]+=cc;
      sum+=sqrt(dd)*cc;
      if((int)num.size()>S) num.erase(--num.end());
    }
  }

  cout<<sum/dom/2<<endl;
  for(auto p:num)
    cout<<p.first<<" "<<p.second/2<<"\n";
  cout<<flush;
  return 0;
}
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.11.3/x64/lib/python3.11/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.11.3/x64/lib/python3.11/site-packages/onlinejudge_verify/languages/cplusplus.py", line 187, in bundle
    bundler.update(path)
  File "/opt/hostedtoolcache/Python/3.11.3/x64/lib/python3.11/site-packages/onlinejudge_verify/languages/cplusplus_bundle.py", line 401, in update
    self.update(self._resolve(pathlib.Path(included), included_from=path))
  File "/opt/hostedtoolcache/Python/3.11.3/x64/lib/python3.11/site-packages/onlinejudge_verify/languages/cplusplus_bundle.py", line 400, in update
    raise BundleErrorAt(path, i + 1, "unable to process #include in #if / #ifdef / #ifndef other than include guards")
onlinejudge_verify.languages.cplusplus_bundle.BundleErrorAt: convolution/numbertheoretictransform.cpp: line 6: unable to process #include in #if / #ifdef / #ifndef other than include guards
Back to top page