gym102394 K. Keeping Rabbits(概率期望)

题意:

gym102394 K. Keeping Rabbits(概率期望)

解法:

设 兔 子 总 重 量 为 s u m 设兔子总重量为sum 设兔子总重量为sum

先 只 考 虑 一 只 兔 子 , 假 设 一 开 始 这 只 兔 子 的 重 量 为 f [ 0 ] 先只考虑一只兔子,假设一开始这只兔子的重量为f[0] 先只考虑一只兔子,假设一开始这只兔子的重量为f[0]

那 么 f [ i ] = f [ i − 1 ] + f [ i − 1 ] s u m + i − 1 那么f[i]=f[i-1]+\frac{f[i-1]}{sum+i-1} 那么f[i]=f[i−1]+sum+i−1f[i−1]​

= ( 1 + 1 s u m + i − 1 ) ∗ f [ i − 1 ] =(1+\frac{1}{sum+i-1})*f[i-1] =(1+sum+i−11​)∗f[i−1]

= s u m + i s u m + i − 1 ∗ f [ i − 1 ] =\frac{sum+i}{sum+i-1}*f[i-1] =sum+i−1sum+i​∗f[i−1]

f [ k ] = f [ 0 ] ∗ s u m + 1 s u m ∗ s u m + 2 s u m + 1 . . . ∗ s u m + k s u m + k − 1 f[k]=f[0]*\frac{sum+1}{sum}*\frac{sum+2}{sum+1}...*\frac{sum+k}{sum+k-1} f[k]=f[0]∗sumsum+1​∗sum+1sum+2​...∗sum+k−1sum+k​

化 简 得 f [ k ] = f [ 0 ] ∗ s u m + k s u m 化简得f[k]=f[0]*\frac{sum+k}{sum} 化简得f[k]=f[0]∗sumsum+k​

= f [ 0 ] + f [ 0 ] ∗ k s u m =f[0]+f[0]*\frac{k}{sum} =f[0]+f[0]∗sumk​

那 么 每 只 兔 子 最 后 的 重 量 就 可 以 O ( 1 ) 计 算 了 那么每只兔子最后的重量就可以O(1)计算了 那么每只兔子最后的重量就可以O(1)计算了

code:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxm=2e6+5;
int a[maxm];
int n,k;
void solve(){
    scanf("%d%d",&n,&k);
    ll sum=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    for(int i=1;i<=n;i++){
        double ans=a[i]+a[i]*1.0/sum*k;
        printf("%.10f ",ans);
    }
    puts("");
}
signed main(){
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

上一篇:有一对兔子,从出生后第3个月起每个月都生一对兔子(超简单解释)


下一篇:Ceph 十年演进的经验教训 —— 磁盘文件系统并不适合作为分布式存储后端