1 条题解

  • 1
    @ 2025-6-16 8:26:29

    我们这道题考虑用总答案除以方案数,然后就会发现相当于对于每一个位置被覆盖成 00 的概率之和

    首先我们可以通过一些简单的方法求出来总线段个数(O(1)O(1) 方法),即 i=nB+1nA+1i\sum_{i=n-B+1}^{n-A+1} i

    然后我们对于每一个点类似地求被覆盖的线段个数,然后统计答案即可

    #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
    上传者