結果
| 問題 |
No.1552 Simple Dice Game
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-06-18 22:40:43 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 145 ms / 2,500 ms |
| コード長 | 1,589 bytes |
| コンパイル時間 | 1,521 ms |
| コンパイル使用メモリ | 168,280 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-22 21:04:32 |
| 合計ジャッジ時間 | 3,952 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define MOD2 998244353
#define rep(i,n) for (long long i = 0; i < (long long)(n); i++)
#define reps(i,s,n) for (long long i = (long long)(s); i < (long long)(n); i++)
#define pr(a) cout << a
#define prl(a) cout << (a) << endl
#define prld(a) cout << setprecision(15)<< (a) << endl
#define allrange(a) a.begin(),a.end()
long long mypow(long long x, long long n) {
long long ret = 1;
while (n > 0) {
if (n & 1) ret = ret * x % MOD2; // n の最下位bitが 1 ならば x^(2^i) をかける
x = x * x % MOD2;
n >>= 1; // n を1bit 左にずらす
}
return ret;
}
long long sum(long long s,long long t){
return (((t-s+1)*(t+s))/2)%MOD2;
}
long long getsum(long long s,long long t,long long n){
long long a = sum(s,t);
long long n2 = n%(MOD2-1);
long long b;
if(n2 == 0) b=1;
else b=mypow((t-s+1),n2-1);
return (((a*b)%MOD2)*(n%MOD2))%MOD2;
}
void solve(long long N, long long M){
long long X1 = getsum(1,M,N);
X1 = (X1*M)%MOD2;
long long X2 = 0;
rep(i,M){
long long buf = getsum(i+1,M,N);
X2 = (X2+buf)%MOD2;
}
X2 = MOD2-X2;
long long X3 = 0;
rep(i,M-1){
long long buf = getsum(1,i+1,N);
X3 = (X3+buf)%MOD2;
}
X3 = MOD2-X3;
long long ans = (X1+X2+X3)%MOD2;
prl(ans);
}
int main(){
std::cin.tie(0); // cinとcoutの同期を解除
std::ios::sync_with_stdio(false);
//1変数入力
long long N,M;
cin >> N >> M;
solve(N,M);
}