【九校聯考】鍛造

來源:互聯網
上載者:User

標籤:精通   垃圾   含義   mes   數組   cout   def   typename   col   

題目描述

“歡迎啊,老朋友。”

一陣寒暄過後,廠長帶他們參觀了廠子四周,並給他們講鍛造的流程。

“我們這裡的武器分成若干的等級,等級越高武器就越厲害,並且對每一等級的武器都有兩種屬性值 b 和 c,但是我們初始只能花 a 個金幣來生產 1 把 0 級劍……”

“所以你們廠子怎麼這麼垃圾啊,不能一下子就造出來 999 級的武器嗎?”勇者不耐煩的打斷了廠長的話。

“別著急,還沒開始講鍛造呢……那我們舉例你手中有一把 x 級武器和一把 y 級武器 (y = max(x?1,0)),我們令鍛造附加值 k = min(c x ,b y ),則你有 k/cx 的機率將兩把武器融合成一把 x + 1 級的武器。”

“……但是,鍛造不是一帆風順的,你同樣有 1 ? k/cx 的機率將兩把武器融合成一把 max(x ? 1,0) 級的武器……”

勇者聽完後暗暗思忖,他知道廠長一定又想藉此機會坑騙他的零花錢,於是求助這個村最聰明的智者——你,來告訴他,想要強化出一把 n 級的武器,其期望花費為多少?

由於勇者不精通高精度小數,所以你只需要將答案對 998244353(7 ×17 × 2 23 + 1,一個質數 ) 模數即可。


輸入

第一行兩個整數 n,a,含義如題所示。

為了避免輸入量過大,第二行五個整數 bx,by,cx,cy,p,按照下列代碼來產生 b 和 c 數組。

b[0]=by+1;c[0]=cy+1;for(int i=1;i<n;i++){  b[i]=((long long)b[i-1]*bx+by)%p+1;  c[i]=((long long)c[i-1]*cx+cy)%p+1;}


輸出

輸出一行一個整數,表示期望花費。


範例輸入

0 6432
4602677 3944535 2618884 6368297 9477531


範例輸出

6432

 


題解

成功的機率p1=k / c[ i-1 ],失敗的機率p2= ( c[ i-1 ] - k ) / c[ i-1 ]。設dp[ i ]表示升到 i 級的期望花費 ,那麼dp[ i ] = p1 * ( dp[ i-1 ] + dp[ i-2 ] ) + p2* ( dp[ i-1 ] + dp[ i ] )。移項化簡:

dp[ i ] = dp[ i-1 ]+ dp[ i-2 ] + ( c[ i-1 ] - k ) * dp[ i-1 ] / k 。預先處理k的逆元,遞推一遍即可。

#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define ll long longconst int maxn=1e7+50;const int mod=998244353;int n,a,bx,by,cx,cy,p,k,inv[maxn];int b[maxn],c[maxn];ll dp[maxn];template<typename T>void read(T& aa){    char cc; ll ff;aa=0;cc=getchar();ff=1;    while((cc<‘0‘||cc>‘9‘)&&cc!=‘-‘) cc=getchar();    if(cc==‘-‘) ff=-1,cc=getchar();    while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();    aa*=ff;}ll qpow(ll a,ll b){    ll ans=1;a%=mod;    for(ll i=b;i;i>>=1,a=a*a%mod)    if(i&1) ans=ans*a%mod;    return ans;}void init(){    inv[1]=1;    for(int i=2;i<=maxn;i++)    inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;}int main(){    freopen("forging.in","r",stdin);    freopen("forging.out","w",stdout);    read(n),read(a);    read(bx),read(by),read(cx),read(cy),read(p);    b[0]=by+1;c[0]=cy+1;    for(int i=1;i<n;i++){        b[i]=((long long)b[i-1]*bx+by)%p+1;        c[i]=((long long)c[i-1]*cx+cy)%p+1;    }    init();    dp[0]=a;    k=min(c[0],b[0]);    dp[1]=(2ll*k*a%mod+1ll*a*(c[0]-k+mod)%mod)%mod*inv[k]%mod;    for(int i=2;i<=n;i++){        k=min(c[i-1],b[i-2]);        dp[i]=((dp[i-1]+dp[i-2])%mod+1ll*dp[i-1]*(c[i-1]-k+mod)%mod*inv[k]%mod)%mod;    }    cout<<dp[n]<<endl;    return 0;}

 

【九校聯考】鍛造

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.