結果

問題 No.3505 Sum of Prod of Root
コンテスト
ユーザー tau1235
提出日時 2026-04-18 18:28:17
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 1,218 ms / 2,000 ms
コード長 1,415 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,133 ms
コンパイル使用メモリ 355,228 KB
実行使用メモリ 125,192 KB
最終ジャッジ日時 2026-04-18 18:28:27
合計ジャッジ時間 6,823 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 13
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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

unsigned long long isqrt_aux(int c,unsigned long long n){
    if (c == 0){
        return 1;
    } else {
        int k = (c - 1) / 2;
        unsigned long long a = isqrt_aux(c / 2, n >> (2*k + 2));
        return (a << k) + (n >> (k+2)) / a;
    }
}
unsigned long isqrt(unsigned long long n){
    if (n == 0){
        return 0;
    } else {
        unsigned long long a = isqrt_aux(( 63 - __builtin_clzll(n)) / 2, n);
        return n <= a * a - 1 ? a - 1 : a;
    }
}

int main(){
  using ll=long long;
  using lll=__int128_t;
  using mint=atcoder::modint998244353;
  auto f=[&](ll n){
    ll l=isqrt(n);
    mint s1=mint(n)*(n+1)/2*l;
    mint s2=mint(l-1)*l*(l+1)*(l+2)*(2*l+1)/20;
    return s1-s2;
  };
  ll n;
  cin>>n;
  map<ll,vector<pair<int,int>>> mp;
  int l=70;
  for (int k=3;k<=l;k++){
    ll now=1;
    while (true){
      lll x=1;
      for (int i=0;i<k;i++){
        x*=now;
      }
      if (x<=n) mp[x].push_back({k,now});
      else break;
      now++;
    }
  }
  vector<ll> vec(l,1);
  vector<ll> seg;
  for (auto p:mp) seg.push_back(p.first);
  seg.push_back(n+1);
  int k=seg.size();
  mint ans=0;
  for (int i=0;i<k-1;i++){
    ll L=seg[i],R=seg[i+1];
    mint s=f(R-1)-f(L-1);
    for (auto [l2,val]:mp[L]) vec[l2]=val;
    mint p=1;
    for (int i=0;i<l;i++) p*=vec[i];
    ans+=s*p;
  }
  cout<<ans.val()<<endl;
}
0