結果
問題 | No.2891 Mint |
ユーザー |
![]() |
提出日時 | 2024-09-13 21:37:59 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 664 ms / 2,000 ms |
コード長 | 1,046 bytes |
コンパイル時間 | 4,157 ms |
コンパイル使用メモリ | 254,680 KB |
最終ジャッジ日時 | 2025-02-24 07:17:50 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 54 |
ソースコード
#include <stdio.h> #include <atcoder/all> #include <bits/stdc++.h> using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001LL //[[l,r],v] l<=x<=rは, floor(N/x)=v vector<pair<pair<long long,long long>,long long>> get_floor(long long N){ vector<pair<pair<long long,long long>,long long>> ret; for(long long i=1;i<=N;i++){ long long v = N/i; ret.emplace_back(make_pair(i,0),v); i = N/v; ret.back().first.second = i; } return ret; } mint sum(long long n){ mint ret = n; ret *= n+1; ret /= 2; return ret; } mint sum(long long l,long long r){ return sum(r) - sum(l-1); } int main(){ long long N,M; cin>>N>>M; auto ret = get_floor(M); mint ans = M; ans *= N; rep(i,ret.size()){ long long l = ret[i].first.first; long long r = ret[i].first.second; r = min(r,N); if(l>r)continue; long long v = ret[i].second; mint t= sum(l,r); ans -= t * v; } cout<<ans.val()<<endl; return 0; }