1 条题解
-
1
我们这道题考虑用总答案除以方案数,然后就会发现相当于对于每一个位置被覆盖成 的概率之和
首先我们可以通过一些简单的方法求出来总线段个数( 方法),即
然后我们对于每一个点类似地求被覆盖的线段个数,然后统计答案即可
#include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #define int long long using namespace std; bool MLE_Test_start; const int N=1e6+10; int T=1,n,m,A,B,sum1,now[N]; long double ret=0,ans[N]; inline int reads(){ char c=getchar(); int x=0,f=1; while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ x=(x<<3)+(x<<1)+(c^48); c=getchar(); } return x*f; } inline void files(){ // freopen("std.in","r",stdin); freopen("std.out","w",stdout); } inline void clr(){ // Don't Forget! } int asks(int l,int r){return (l+r)*(r-l+1)/2;} bool MLE_Test_end; signed main(){ // printf("%lf\n",(&MLE_Test_end-&MLE_Test_start-1)/1024.0/1024.0); // files(); // T=reads(); while(T--){ clr(); n=reads(),m=reads(),A=reads(),B=reads(); sum1=asks(n-B+1,n-A+1); // cout<<sum1<<"\n"; for(int i=1;i<=n;i++){ int lft=min(i-1,n-i),rght=max(i-1,n-i); // now[i]=asks(min(max(rght-A+1),max(0,lft-B+1)),max(max(0,lft-B+1),max(0,rght-A+1))); now[i]=asks(max(0ll,rght-B+1),max(0ll,rght-A+1))+asks(max(0ll,lft-B+1),max(0ll,lft-A+1)); // cout<<i<<":"<<now[i]<<"\n"; // now[i]=sum1-now[i]; ans[i]=1-1.0*pow((long double)now[i]/sum1,m); ret+=ans[i]*1.0; // cout<<now[i]<<" "<<ans[i]<<" "<<(long double)now[i]/sum1<<" "<<lft<<" "<<rght<<" "<<"\n"; } cout<<fixed<<setprecision(3)<<ret<<"\n"; } return 0; }
- 1
信息
- ID
- 275
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 3
- 已通过
- 2
- 上传者