UVA 10169 Urn-ball Probabilities !

UVA_10169

    这个题目明显可以预处理出结果然后再随用随查。计算的公式并不难推导,在计算0的个数的时候采用一个X=10^(log10(X))这样的转化,这样便只需计算出-log10(X)的整数部分即可。

    此外,需要注意的是涉及整数乘法的地方一定要避免溢出,如果中间结果会超过int的范围可以在计算之前根据需要强制转型成double或者long long。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXD 1000010
double f[MAXD];
int d[MAXD];
void prepare()
{
int i, j, k;
double p1 = 1, p2 = 0;
for(i = 1; i < 1000000; i ++)
{
p1 = p1 * ((double)i * i + i - 1) / ((double)i * i + i);
p2 += log10((double)i * i + i);
f[i] = 1 - p1;
d[i] = (int)(p2 - fmod(p2, 1) + 0.5);
}
}
int main()
{
int n;
prepare();
while(scanf("%d", &n) == 1)
{
if(n == 0)
printf("0.000000 0\n");
else
printf("%.6lf %d\n", f[n], d[n]);
}
return 0;
}


你可能感兴趣的:(uva)