【NOIP2013模拟9.29】TheSwaps
Description
Alice得到了一個(gè)整數(shù), 她將其視作長(zhǎng)度為n的字符串S。為了好玩,她進(jìn)行了k次如下操作:
1) 隨機(jī)選取兩個(gè)不同的位置x和y(即每次操作, { < x, y> | 1<=x < y <=n}中每個(gè)元素都有相同的概率被選到)
2) 交換數(shù)位S[x]和數(shù)位S[y]
為了自虐,在Alice惡搞之后,Bob會(huì)隨機(jī)一個(gè)子串(即對(duì)于任意子串都有相同概率被選到),然后他想知道他選出的子串中各個(gè)位置數(shù)字之和的期望為多少。聰明的Bob想出了一個(gè)很好的方法來(lái)解決這個(gè)問(wèn)題,那就是把這個(gè)問(wèn)題交給你。Bob會(huì)告訴你S和k,你需要告訴他期望。
Input
一行,包含字S和k。
Output
一行,一個(gè)實(shí)數(shù)。當(dāng)你的輸出和標(biāo)準(zhǔn)答案的差距少于10^-6時(shí),被認(rèn)為是正確的。
Sample Input
輸入1:
477 1
輸入2:
57268508514909598902647806463326698034850446919720257361969 7
Sample Output
輸出1:
10
輸出2:
98.3238536775161
Data Constraint
對(duì)于70%的數(shù)據(jù) |S|<=2500,k<=1000000
對(duì)于100%的數(shù)據(jù) |S|<=1000000,k<=1000000
.
.
.
.
.
分析
k次交換后,ANS=每一位的期望值*每一位被選出的概率。
顯然第i位被選出的概率=包含i的子串?dāng)?shù)/總子串?dāng)?shù)=i*(l-i+1)/(l*(l+1)/2)。
那如何求k次交換后每一位的期望值?
我們假設(shè)最初第i位為ai,p次交換后第i位仍然等于ai的概率是x,那么p+1交換后第i為仍然等于ai的概率是x*(1-(l-1)/y))+(1-x)/y,其中y=l*(l-1)/2。
接下來(lái)有一個(gè)性質(zhì):
如果第i位不為ai,那么第i位是a中其他任何數(shù)的概率都是一樣的(交換的隨機(jī)性決定的)。
因此如果k次交換后,第i位為ai的概率是x,那么第i位的期望值=ai*x+(tj-ai)/(l-1)*(1-x)。
至此問(wèn)題就可以解決了。
.
.
.
.
.
程序:
#include<iostream> #include<string.h> #include<cstdio> using namespace std; double x,y,rp,u,v; int a[1000001],tj,l,k; char zf[1000001];void jb() {cin>>zf;cin>>k;l=strlen(zf);x=1.0;y=l*(l-1.0)/2.0;for (int i=1;i<=k;i++) x=x*(1.0-(l-1.0)/y)+(1.0-x)/y;for (int i=1;i<=l;i++){a[i]=zf[i-1]-'0';tj+=a[i];} }int main() {jb();for (int i=1;i<=l;i++){u=i*(double)(l-i+1.0)/(double)(l*(l+1.0)/2.0);v=(double)a[i]*x+(double)(tj-a[i])/(double)(l-1.0)*(1.0-x);rp+=u*v;}printf("%.9lf",rp);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499919.html
總結(jié)
以上是生活随笔為你收集整理的【NOIP2013模拟9.29】TheSwaps的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【NOIP2013模拟9.29】密码
- 下一篇: 【NOIP2013模拟9.29】Mixi