たんぞう
1925 ワード
「ようこそ、旧友」挨拶の後、工場長は彼らを工場の周りを見学させ、鍛造の流れを話した.「私たちの武器はいくつかの等級に分かれています.等級が高いほど武器が強くなります.そして、各等級の武器には2つの属性値bとcがあります.しかし、私たちは最初は1つの金貨で0級の剣を生産するしかありませんでした......」「だから、あなたの工場はどうしてこんなにゴミなのですか.999級の武器を一気に作ることができませんか.」勇者はうんざりして工場長の話を中断した.「焦らないで、まだ鍛造の話を始めていないんですが……例えば、x級武器とy y y級武器(y=m a x(x−1,0))(y=max(x−1,0))(y=max(x−1,0))(y=max(x−1,0))、鍛造付加値k=m i n(c x,b y)k=min(cx,by)k=min(cx,by)では、k c xfrac{k}{cx}cxkの確率は2つの武器を1つのx+1級の武器に融合させる.」「……しかし、鍛造は順風満帆ではない.あなたも同じように1−k c xfrac{1−k}{cx}cx 1−kの確率で2つの武器を1本のm a x(x−1,0)max(x−1,0)max(x−1,0)級の武器に融合させることができる......」勇者はそれを聞いてひそかに考えた.工場長はまたこの機会に小遣いをだまそうとしたに違いない.そこでこの村の最も聡明な知者--あなたは、彼にn級の武器を強化したいと言って、その期待はいくらかかりますか?勇者は高精度小数点以下に精通していないので、998244353(7)に答えを合わせるだけです.× 17 × 2 23+1、1質量)998244353(7× 17 × 2^{23}+1,質量数)998244353(7×17×223+1、素数1つ)型を取ればよい.非常テンプレートの期待DP:定義:F i F_{i}Fiはi i iレベルに強化するための期待費用としてF i F_{i}FiはF i−1 F_から{i−1}Fi−1が移行i i iが1でない場合:P i P_がある{i}Piの確率は成功し,これは実際にはF i=(F i−1+F i−2)∗P i F_である.{i}=(F_{i-1}+F_{i-2})*P_{i}Fi=(Fi−1+Fi−2)∗Piが失敗する可能性があるこのときF i−2 F_が得られた{i−2}Fi−2ではもう1つのF i−1 F_がかかる{i−1}Fi−1は合成を開始することができ,すなわちF i=(F i−2+F i−1)∗P i+(F i+F i−1)∗(1−P i)F_を統合することができる.{i}=(F_{i-2}+F_{i-1})*P_{i}+(F_{i}+F{i−1})*(1−P_{i})Fi=(Fi−2+Fi−1)∗Pi+(Fi+Fi−1)∗(1−Pi)解析すればよい
#include
#include
#include
#include
#include
using namespace std;
const int N=1e7+10;
typedef long long LL;
const LL mod=998244353;
LL F[N];
int Inv[N];
int B[N];
int C[N];
LL bx,by,cx,cy,a;
int n;
LL p;
void Pre(){
B[0]=by+1;C[0]=cy+1;
for(int i=1;i>n>>a>>bx>>by>>cx>>cy>>p;
Pre();
F[0]=a;
F[1]=a*(1LL+1LL*C[0]*Inv[min(B[0],C[0])]%mod)%mod;
for(int i=2;i<=n;++i){
F[i]=(F[i-2]+1LL*C[i-1]*F[i-1]%mod*Inv[min(B[i-2],C[i-1])]%mod)%mod;
}
cout<