當前位置:
首頁 >
P3750-[六省联考2017]分手是祝愿【期望dp】
發布時間:2023/12/3
34
豆豆
生活随笔
收集整理的這篇文章主要介紹了
P3750-[六省联考2017]分手是祝愿【期望dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problem/P3750
題目大意
nnn盞燈和按鈕,每次隨機選擇一個xxx按下后會讓xxx的倍數的燈都取反,然后若最少kkk步就可以將所有燈關閉那么直接選擇最優策略,求關閉所有燈的期望次數。
解題思路
做期望dpdpdp,設fif_ifi?表示從i+1i+1i+1個需要按下的到iii個需要按下的時的期望次數,有轉移方程
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)
然后化簡為
fi=n+(n?i)?fi+1if_i=\frac{n+(n-i)*f_{i+1}}{i}fi?=in+(n?i)?fi+1??
然后我們考慮燈的性質,我們發現有些燈是必須按下的,而其他的燈都是不能按下的。所有我們可以計算出一個數numnumnum表示有多少按鈕必須按下,這時我們可以發現答案就是(∑i=k+1numfi)+k(\sum_{i=k+1}^{num}f_i)+k(∑i=k+1num?fi?)+k,當然要特判一下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); }總結
以上是生活随笔為你收集整理的P3750-[六省联考2017]分手是祝愿【期望dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么远程控制他人电脑如何用电脑远程监
- 下一篇: 牛客练习赛51-记录