P3750-[六省联考2017]分手是祝愿【期望dp】
正題
題目鏈接:https://www.luogu.org/problem/P3750
題目大意
nnn盞燈和按鈕,每次隨機(jī)選擇一個(gè)xxx按下后會(huì)讓xxx的倍數(shù)的燈都取反,然后若最少kkk步就可以將所有燈關(guān)閉那么直接選擇最優(yōu)策略,求關(guān)閉所有燈的期望次數(shù)。
解題思路
做期望dpdpdp,設(shè)fif_ifi?表示從i+1i+1i+1個(gè)需要按下的到iii個(gè)需要按下的時(shí)的期望次數(shù),有轉(zhuǎn)移方程
fi=in+n?in(fi+1+fi+1)f_i=\frac{i}{n}+\frac{n-i}{n}(f_{i+1}+f_{i}+1)fi?=ni?+nn?i?(fi+1?+fi?+1)
然后化簡(jiǎn)為
fi=n+(n?i)?fi+1if_i=\frac{n+(n-i)*f_{i+1}}{i}fi?=in+(n?i)?fi+1??
然后我們考慮燈的性質(zhì),我們發(fā)現(xiàn)有些燈是必須按下的,而其他的燈都是不能按下的。所有我們可以計(jì)算出一個(gè)數(shù)numnumnum表示有多少按鈕必須按下,這時(shí)我們可以發(fā)現(xiàn)答案就是(∑i=k+1numfi)+k(\sum_{i=k+1}^{num}f_i)+k(∑i=k+1num?fi?)+k,當(dāng)然要特判一下num≤knum\leq knum≤k的情況。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=110000,XJQ=100003; ll n,a[N],f[N],num,ans,k; ll power(ll x,ll b) {ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans; } int main() {scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=n;i>=1;i--)if(a[i]){num++;for(ll j=1;j*j<=i;j++)if(!(i%j)){a[j]^=1;if(j*j!=i) a[i/j]^=1;}}f[n+1]=1;for(ll i=n;i>=1;i--)f[i]=((n-i)*f[i+1]%XJQ+n)%XJQ*power(i,XJQ-2)%XJQ;if(num<=k) ans=num;else{for(ll i=k+1;i<=num;i++)(ans+=f[i])%=XJQ;(ans+=k)%=XJQ;}for(ll i=1;i<=n;i++)ans=ans*i%XJQ;printf("%lld",ans); }總結(jié)
以上是生活随笔為你收集整理的P3750-[六省联考2017]分手是祝愿【期望dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么远程控制他人电脑如何用电脑远程监
- 下一篇: 牛客练习赛51-记录