[spojRNG]Random Number Generator

先将所有数加上Ri,即变为区间[0,2Ri],考虑容斥,将区间容斥为[0,+oo)-[2Ri,+oo),然后对[2Ri,+oo)令$bi=ai-2Ri$,相当于范围都是[0,+oo)
问题转化为求n个正无穷范围的数和不超过b的方案数,大胆猜测后发现就是$b^{n}/n!$,暴力累计即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ld long double
 4 int t,n,x,y,a[11];
 5 ld ans;
 6 ld calc(int k){
 7     if (k<=0)return 0;
 8     ld ans=1;
 9     for(int i=1;i<=n;i++)ans=ans*k/i;
10     return ans; 
11 }
12 int main(){
13     scanf("%d",&t);
14     while (t--){
15         scanf("%d%d%d",&n,&x,&y);
16         ans=0;
17         for(int i=0;i<n;i++){
18             scanf("%d",&a[i]);
19             x+=a[i];
20             y+=a[i];
21             a[i]=a[i]*2;
22         }
23         for(int i=0;i<(1<<n);i++){
24             int p=1,s=0;
25             for(int j=0;j<n;j++)
26                 if (i&(1<<j)){
27                     p*=-1;
28                     s+=a[j];
29                 }
30             ans+=p*(calc(y-s)-calc(x-s));
31         }
32         for(int i=0;i<n;i++)ans/=a[i];
33         printf("%.9Lf\n",ans);
34     }
35 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11725927.html