結果
| 問題 | No.2834 Work to Play |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-08-03 00:50:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 17 ms / 2,000 ms |
| コード長 | 1,610 bytes |
| コンパイル時間 | 810 ms |
| コンパイル使用メモリ | 79,852 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2024-09-25 11:46:31 |
| 合計ジャッジ時間 | 4,051 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 89 |
ソースコード
#include<iostream>
#include<cassert>
#include<atcoder/modint>
#include<atcoder/segtree>
#include<atcoder/lazysegtree>
using namespace std;
using mint=atcoder::modint998244353;
long long N,A,K;
int V[3<<17];
mint c[3<<17];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N>>A>>K;
if(N<K+K)
{
V[0]=0;
c[0]=0;
mint ans=0;
for(int i=1;i<=N;i++)
{
V[i]=V[i-1]+A;
c[i]=c[i-1]+(V[i]/K);
V[i]%=K;
ans+=c[i]*(i*2);
}
int cur=0;
for(int i=N;i>=1;i--)if(V[i]>0)
{
if(cur==0)ans+=i*2,cur=V[i];
else
{
cur+=V[i];
if(cur>K)ans+=i*2;
cur%=K;
}
}
cout<<ans.val()<<endl;
return 0;
}
V[0]=0;
c[0]=0;
int k=2*K;
for(int i=1;i<=k+N%k;i++)
{
V[i]=V[i-1]+A;
c[i]=c[i-1]+(V[i]/K);
V[i]%=K;
}
assert(V[N%k]==V[k+N%k]);
mint ans0=0,ans1=0,ans2=0;
mint v=c[k+N%k]-c[N%k];
{
int cur=0;
for(int i=k+N%k;i>N%k;i--)
{
//ans+=2*(c[i]+v*j)*(i+k*j);
ans0+=2*c[i]*i;
ans1+=2*c[i]*k+2*v*i;
ans2+=2*v*k;
if(V[i]>0)
{
if(cur==0)
{
//ans+=2*(i+k*j)
ans0+=2*i;
ans1+=2*k;
cur=V[i];
}
else
{
cur+=V[i];
if(cur>K)
{
//ans+=2*(i+k*j)
ans0+=2*i;
ans1+=2*k;
}
cur%=K;
}
}
}
assert(cur==0);
}
mint ans=0;
int cur=0;
for(int i=N%k;i>=1;i--)
{
ans+=2*c[i]*i;
if(V[i]>0)
{
if(cur==0)ans+=i*2,cur=V[i];
else
{
cur+=V[i];
if(cur>K)ans+=i*2;
cur%=K;
}
}
}
mint J=N/k;
//ans+=sum_{j=0..J-1}(ans0+ans1*j+ans2*j*j)
ans+=ans0*J;
ans+=ans1*J*(J-1)/2;
ans+=ans2*J*(J-1)*(2*J-1)/6;
cout<<ans.val()<<endl;
}