結果

問題 No.1547 [Cherry 2nd Tune *] 偶然の勝利の確率
ユーザー kakel-san
提出日時 2021-06-13 17:22:32
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 661 ms / 2,000 ms
コード長 3,582 bytes
コンパイル時間 17,243 ms
コンパイル使用メモリ 167,164 KB
実行使用メモリ 186,668 KB
最終ジャッジ日時 2024-12-23 06:04:40
合計ジャッジ時間 20,700 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 36
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (206 ms)。
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #
プレゼンテーションモードにする

using System;
using System.Collections.Generic;
using static System.Console;
using System.Linq;
class yc299
{
static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
static int[][] NMap(int n) => Enumerable.Repeat<int>(0, n).Select(_ => NList).ToArray();
static void Main()
{
var x = NList;
var y = NList;
var k = NList[0];
var (ma, na, s) = (x[0], x[1], x[2]);
var (mb, nb, t) = (y[0], y[1], y[2]);
var key = 998244353;
var revna = PowMod(na, key - 2, key);
var revnb = PowMod(nb, key - 2, key);
var amap = AMap(s + t + 1, ma, revna, key);
var bmap = BMap(s + t + 1, mb, revnb, key);
var nmap = Mul(bmap, amap, key);
var dp = new long[s + t + 1];
dp[t] = 1;
var tmp = k;
while (tmp > 0)
{
if (tmp % 2 == 1)
{
dp = Mul(nmap, dp, key);
}
nmap = Mul(nmap, nmap, key);
tmp >>= 1;
}
WriteLine(dp.Last());
WriteLine(dp[0]);
}
static long[,] AMap(int size, int ma, int revna, int key)
{
var amap = new long[size, size];
amap[0, 0] = 1;
amap[size - 1, size - 1] = 1;
for (var y = 1; y < size - 1; ++y)
{
var poss = (long)ma * revna % key;
var val = 1L;
var rev = (1 + key - poss) % key;
for (var x = y; x < size - 1; ++x)
{
amap[x, y] = val * rev % key;
val = (val * ma % key) * revna % key;
}
amap[size - 1, y] = val;
}
return amap;
}
static long[,] BMap(int size, int mb, int revnb, int key)
{
var bmap = new long[size, size];
bmap[0, 0] = 1;
bmap[size - 1, size - 1] = 1;
for (var y = size - 2; y > 0; --y)
{
var poss = (long)mb * revnb % key;
var val = 1L;
var rev = (1 + key - poss) % key;
for (var x = y; x > 0; --x)
{
bmap[x, y] = val * rev % key;
val = (val * mb % key) * revnb % key;
}
bmap[0, y] = val;
}
return bmap;
}
static long[,] Mul(long[,] a, long[,] b, int key)
{
var h = a.GetLength(0);
var w = b.GetLength(1);
var cm = a.GetLength(1);
var map = new long[h, w];
for (var i = 0; i < h; ++i)
{
for (var j = 0; j < w; ++j)
{
for (var c = 0; c < cm; ++c)
{
map[i, j] = (map[i, j] + a[i, c] * b[c, j]) % key;
}
}
}
return map;
}
static long[] Mul(long[,] a, long[] list, int key)
{
var len = a.GetLength(0);
var res = new long[len];
for (var i = 0; i < len; ++i) for (var j = 0; j < list.Length; ++j)
{
res[i] = (res[i] + a[i, j] * list[j]) % key;
}
return res;
}
static int PowMod(int n, int p, int keyNum)
{
long _n = n % keyNum;
var _p = p;
var result = 1L;
if ((_p & 1) == 1)
{
result *= _n;
}
while (_p > 0)
{
_n = _n * _n % keyNum;
_p >>= 1;
if ((_p & 1) == 1)
{
result = (result * _n) % keyNum;
}
}
return (int)result;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0