所有的组合中包含某个数的次数对于所有的数来说是相同的,那么就求出这个次数乘以所有数的和然后除以总的组合次数就可以了。开始想复杂了。。。
可以先预处理下,然后直接输出。
代码如下:
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
double dp[100001][6];
int main()
{
int x, b, t, i, num=0, j, k;
double ans1, ans2;
for(i=1; i<=5; i++) {
dp[1][i]=1;
}
for(i=2; i<=100000; i++) {
dp[i][1]=dp[i-1][1]+i;
for(j=2; j<=5; j++) {
ans1=ans2=1;
for(k=1; k<j; k++) {
ans1*=i;
}
for(k=1;k<j;k++){
ans2*=(i-1);
}
dp[i][j]=(i*ans1-(i-1)*ans2)*(i*1.0*(i+1)/2.0);
}
}
scanf("%d",&t);
while(t--) {
scanf("%d%d",&x,&b);
num++;
printf("Case #%d: ",num);
double ans=1;
for(i=0; i<b; i++) {
ans*=x;
}
printf("%.3f\n",dp[x][b]/ans);
}
return 0;
}