https://ac.nowcoder.com/acm/contest/874/D
题目大意是给定两个数组A和B 数组的元素可以打乱重新排列 然后求∑ni=1 AiBi
的期望
我是这么理解的:
由于可以打乱重新排列,所以每个位置上的期望都是一样的(A的期望*B的期望),又因为是n个位置 那么就是A的和*B的和/n
那么怎么保留30位小数呢?用double显然不行,这就需要模拟除法(高精度运算),也可以说是模板题了
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { long long sa=0,sb=0,n,anss[35],s,i,x; cin>>n; for(i=0;i<n;i++) { cin>>x; sa+=x; } for(i=0;i<n;i++) { cin>>x; sb+=x; } s=sa*sb; anss[0]=s/n; for(i=1;i<=31;i++) { s=s%n*10; anss[i]=s/n; } if(anss[31]>=5) anss[30]++; i=30; while(i>0) //这里是对进位的模拟 { if(anss[i]==10) { anss[i]=0; i--; anss[i]++; } else break; } printf("%lld.",anss[0]); //整数位要用lld输出 for(i=1;i<=30;i++) printf("%d",anss[i]); printf("\n"); } return 0; }
原文:https://www.cnblogs.com/dyhaohaoxuexi/p/10854929.html