結果

問題 No.2952 Invision of Multiples
ユーザー 蜜蜂蜜蜂
提出日時 2024-10-25 22:32:39
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 4,543 bytes
コンパイル時間 3,787 ms
コンパイル使用メモリ 211,192 KB
実行使用メモリ 50,468 KB
最終ジャッジ日時 2024-10-25 22:32:49
合計ジャッジ時間 9,724 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 TLE -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

// g++-13 1.cpp -std=c++17 -O2 -I .
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/tag_and_trait.hpp>
using namespace __gnu_pbds;


#include <atcoder/modint>
#include <atcoder/maxflow>
#include <atcoder/math>
#include <atcoder/mincostflow>
using namespace atcoder;


using ll = long long;
using ld = long double;

using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vld = vector<ld>;
using vvld = vector<vld>;
using vst = vector<string>;
using vvst = vector<vst>;
 
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define pq_big(T) priority_queue<T,vector<T>,less<T>>
#define pq_small(T) priority_queue<T,vector<T>,greater<T>>
#define all(a) a.begin(),a.end()
#define rep(i,start,end) for(ll i=start;i<(ll)(end);i++)
#define per(i,start,end) for(ll i=start;i>=(ll)(end);i--)
#define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end())

random_device seed;
mt19937_64 randint(seed());

ll grr(ll mi, ll ma) { // [mi, ma)
    return mi + randint() % (ma - mi);
}

// https://judge.yosupo.jp/submission/82871
// https://judge.yosupo.jp/submission/233535

#include <vector>

template< typename S, S (*op)(S, S), S (*e)() >
struct segmenttree{
  private:
  int _n;
  std::vector<S> node;

  public:
  segmenttree() = default;
    
  segmenttree(int n){
    _n=1;
    while(_n<n)_n*=2;
    node.resize(2*_n,e());
  }
  segmenttree(std::vector<S> &v){
    int n=v.size();
    _n=1;
    while(_n<n)_n*=2;
    node.resize(2*_n,e());
    for(int i=0;i<n;i++){
      node[i+_n]=v[i];
    }
    for(int i=_n-1;i>=0;i--){
      node[i]=op(node[2*i],node[2*i+1]);
    }
  }

  // [i] <- val
  void set(int i,S val){
    i+=_n;
    node[i]=val;
    while(i>1){
      i>>=1;
      node[i]=op(node[2*i],node[2*i+1]);
    }
  }

  // [i] <- op([i],val)
  void update(int i,S val){
    i+=_n;
    node[i]=op(node[i],val);
    while(i>1){
      i>>=1;
      node[i]=op(node[2*i],node[2*i+1]);
    }
  }

  S get(int i){
    i+=_n;
    return node[i];
  }

  S prod(int l,int r){
    S pdl=e(),pdr=e();
    l+=_n;r+=_n;

    while(l<r){
      if(l&1)pdl=op(pdl,node[l++]);
      if(r&1)pdr=op(node[--r],pdr);
      l>>=1;r>>=1;
    }

    return op(pdl,pdr);
  };
};


using mint = modint998244353;

mint op(mint a,mint b){
  return a+b;
}
mint e(){
  return 0;
}

int sq = 100;

mint f(int m,int x,int y){
  // ax > by かつ ax <= m なる (a, b) の個数
  // sum_a(= 0 to m / x - 1) floor((a * x + x - 1) / y)

  // 2a > 3b かつ 2a <= 7
  // 2-1/3 + 4-1/3 + 6-1/3
  mint res=floor_sum(m/x,y,x,x-1);

  mint nv=0;
  rep(i,1,m+1){
    rep(j,1,m+1){
      if(i*x>j*y&&i*x<=m){
        nv++;
      }
    }
  }
  if(nv!=res){
    cout<<m<<" "<<x<<" "<<y<<" "<<res.val()<<" "<<nv.val()<<endl;
  }

  if(res.val()==0)return res;
  // cout<<m/x<<" "<<m/y<<endl;
  res/=(m/x);
  res/=(m/y);
  return res;
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  auto st=clock();

  int n,m;cin>>n>>m;
  vi d(n);
  rep(i,0,n)cin>>d[i];

  segmenttree<mint,op,e> seg(m+1);
  vi cnt(sq+1,0);
  vector<mint> aft(sq+1,0);
  mint ans=0;

  vector<vector<mint>> f_large_small(sq+1,vector<mint>(m+1)),f_small_large(sq+1,vector<mint>(m+1));
  // f_large_small[i][j] := f(j,i)
  // f_small_large[i][j] := f(i,j)

  rep(i,1,sq+1){
    rep(j,1,m+1){
      f_large_small[i][j]=f(m,j,i);
      f_small_large[i][j]=f(m,i,j);
    }
  }

  auto ini=clock();
  cerr<<(ld)(ini-st)/(CLOCKS_PER_SEC)<<endl;

  rep(i,0,n){
    // cout<<ans.val()<<endl;
    if(d[i]>sq){
      // large large
      mint ad=1;
      ad/=(m/d[i]);
      rep(j,1,m+1){
        if(j*d[i]>m)break;
        ans+=seg.prod(j*d[i],m+1)*ad;
      }
      // cout<<" "<<ans.val()<<endl;
      // small large
      rep(j,1,sq+1){
        ans+=cnt[j]*f_small_large[j][d[i]];
        aft[j]+=f_large_small[j][d[i]];
      }
      // cout<<ad.val()<<endl;
      rep(j,1,m+1){
        if(j*d[i]>m)break;
        seg.update(j*d[i],ad);
      }
    }
    else{
      // large small
      ans+=aft[d[i]];

      // small small
      rep(j,1,sq+1){
        // if(cnt[j]>0)cout<<j<<"  : "<<cnt[j]<<"*"<<f_small_large[j][d[i]].val()<<endl;
        ans+=cnt[j]*f_small_large[j][d[i]];
      }

      cnt[d[i]]++;
    }
  }

  rep(i,0,n){
    ans*=(m/d[i]);
  }

  cout<<ans.val()<<endl;
}

/*
D large D large
D small D large
D small D small 前計算?
D large D small
*/
0