日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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 knumk的情況。


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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。