【確率と期待】[CodeForces-621 C]Wet Shark and Flowers


テーマの大意
n個のサメが囲まれていて、それぞれのサメには数字が書かれた花があり、i番目のサメの数字は[li,ri]区間などの確率で選択され、隣接する2つのサメの数字の積がpの倍数であれば、Wet Sharkは彼らに1人当たり1000元を与える.
ぶんせき
サンプル空間のサイズは
S=∏i=1n(ri−li+1)
それぞれの状況は確率的に現れ、すべての状況のWet Sharkが払うべきお金をSで割るだけでいい.
しかし、明らかに直接そうすることはできません.最適化を考えています.
i匹目のサメの値に
npi個の数字はpで消去される.
npi=⌊rip⌋−⌊li−1p⌋
i匹目とi+1匹目のサメを考えると、i匹目のサメの数字がpを除いた場合、i+1匹目のサメがどんな数字を取っても、積は除去されます.
i番目のサメの数字がpで除去されない場合、i+1番目のサメが質量数を取ったときに蓄積してこそpで除去される.
つまりこの2匹のサメの答えへの貢献です
Gi=2000∗(npi∗(ri+1−li+1)+(ri−li+1−npi)∗npi+ 1)∗∏πnj=1およびj≠i,i+1(rj−lj+1)S=2000∗(npi∗(ri+ 1−li+ 1)+(ri−li+ 1−npi)∗npi+ 1)∗∏nj=1およびj≠i,i+1(r−j−jljljljljljl)+(r+1(r+1(r−j−j−jljljljljljljl)+(n+1))+1,j≠+1)∏nj=1(rj−lj+1)=2000∗(npi∗(ri+1−li+1)+(ri−li+1−npi)∗npi+1)(ri−li+1)∗(ri+1−li+1+1)
この公式に基づいて答えを算出すればよい.
注意:1とnも隣接しています.
コード#コード#
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 100000
int n,p,l[MAXN+10],r[MAXN+10],np[MAXN+10];
double ans;
void Read(int &x){
    char c;
    while(c=getchar(),c!=EOF)
        if(c>='0'&&c<='9'){
            x=c-'0';
            while(c=getchar(),c>='0'&&c<='9')
                x=x*10+c-'0';
            ungetc(c,stdin);
            return;
        }
}
void read(){
    Read(n),Read(p);
    for(int i=1;i<=n;i++){
        Read(l[i]),Read(r[i]);
        np[i]=r[i]/p-(l[i]-1)/p;
    }
}
void solve(){
    int i;
    for(i=1;i<=n;i++)
        ans+=(1.0*np[i]*(r[i%n+1]-l[i%n+1]+1)+1.0*(r[i]-l[i]+1-np[i])*np[i%n+1])/(r[i]-l[i]+1)*2000/(r[i%n+1]-l[i%n+1]+1);
}   
int main()
{
    read();
    solve();
    printf("%.7lf",ans);
}