結果
| 問題 |
No.3364 Push_back Operation
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-17 22:47:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 173 ms / 2,000 ms |
| コード長 | 2,220 bytes |
| コンパイル時間 | 4,360 ms |
| コンパイル使用メモリ | 234,312 KB |
| 実行使用メモリ | 7,840 KB |
| 最終ジャッジ日時 | 2025-11-17 22:47:33 |
| 合計ジャッジ時間 | 9,479 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 53 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
typedef modint998244353 mint;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = 1; i <= (int)(n); i++)
#define ll long long
istream& operator>>(istream& is,mint& m) {
long long val;
is>>val;
m=val;
return is;
}
vector<mint> PTS(vector<mint> P,mint c){
int n=P.size()-1;
vector<mint> fact(n+1);
vector<mint> invfact(n+1);
vector<mint> cc(n+1);
fact[0]=1;
invfact[0]=1;
cc[0]=1;
rrep(i,n){
fact[i]=fact[i-1]*i;
cc[i]=cc[i-1]*c;
}
invfact[n]=fact[n].inv();
for(int i=n-1;i>=1;i--) invfact[i]=invfact[i+1]*(i+1);
vector<mint> X1(n+1);
vector<mint> X2(n+1);
rep(i,n+1){
X1[i]=P[n-i]*fact[n-i];
X2[i]=cc[i]*invfact[i];
}
vector<mint> X=convolution(X1,X2);
vector<mint> ans(n+1);
rep(i,n+1){
ans[i]=X[n-i]*invfact[i];
}
return ans;
}
vector<mint> inv(const vector<mint>& f, int n) {
assert(n > 0);
assert(f.size() > 0 && f[0].val() != 0);
vector<mint> H(1);
H[0] = f[0].inv();
int k = 1;
while (k < n) {
int k2 = k * 2;
vector<mint> f_k(f.begin(), f.begin() + min((int)f.size(), k2));
if (f_k.size() < k2) f_k.resize(k2, 0);
vector<mint> H_k = H;
H_k.resize(k2, 0);
vector<mint> fH = convolution(f_k, H_k);
vector<mint> T(k2);
for(int i = 0; i < k2; i++) {
T[i] = -fH[i];
}
T[0] += 2;
H.resize(k2, 0);
H = convolution(H, T);
H.resize(k2);
k = k2;
}
H.resize(n);
return H;
}
int C=400009;
vector<mint> fact(C+1),invfact(C+1);
mint binom(int n,int r){
if (r>n) return 0;
else{
return fact[n]*invfact[r]*invfact[n-r];
}
}
int main(){
fact[0]=1;
invfact[0]=1;
rrep(i,C) fact[i]=fact[i-1]*i;
invfact[C]=fact[C].inv();
for(int i=C-1;i>=1;i--) invfact[i]=invfact[i+1]*(i+1);
ll n;
cin>>n;
mint ans=0;
for(ll l=1;l<=n;){
ll i=n/l;
if(i==0) break;
ll r=n/i;
mint j=mint(i);
mint s=0;
if(j.val()==1) s=r-l+1;
else{
s=j.pow(l)*(j.pow(r-l+1)-1)*(j-1).inv();
}
ans+=s;
l=r+1;
}
cout<<ans.val()<<endl;
}