题意:
解法:
设 兔 子 总 重 量 为 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;
}