我事后想了一下,double被卡精度应该是过程中加到了一个比较大的数,double用了很多位去表示整数部分。办法就是利用一个long long去模拟,由于没有负数还可以是unsigned的,等于完整利用上了64位精度。具体操作就是在每次加上去前 *N,N是一个合适的较大值,最后再除掉,这样模拟了一个固定阶数的小数。代码放在下面,没有仔细调输出,并且也不能保证能ac,毕竟我没办法再测试了。另一种思路就是每次都将整数部分提取出来放到一个int里,这样double可以完整保留小数部分的精度。 #include<bits/stdc++.h> using namespace std; unsigned long long N=10000000000; unsigned long long M=N/10000; int main() { int n=10000; unsigned long long sum=0; if(n==1){ printf("1.0000\n"); return 0; } for(int i=1; i<=n-1; i++){ int j=n-i; if(abs(i-j)<2){ sum = sum + N*max(i,j); }else{ sum = sum + N*min(i,j); int k=abs(i-j); unsigned long long temp=0; for(int t=1; t<=k-1; t++){ temp = temp + N*max(t, k-t); } sum = sum + temp/(k-1); } } unsigned long long res = sum/(n-1); double ret = res/N + res%N/M; if(res%N/M==0) printf("%.4lf\n", ret); else printf("%d.%d\n", res/N, res%N/M); }
2 5

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
牛客网
牛客企业服务