日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3750-[六省联考2017]分手是祝愿【期望dp】

發(fā)布時(shí)間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3750-[六省联考2017]分手是祝愿【期望dp】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接: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 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); }

總結(jié)

以上是生活随笔為你收集整理的P3750-[六省联考2017]分手是祝愿【期望dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。