Portal de temas
Significado de la pregunta: En una carretera con una longitud de 100000000, hay aleatoriamente n minas terrestres en puntos enteros ( n <= 10 n <= 10norte<=1 0 ). Acabas de empezar en el punto 1, conppProbabilidad de p avances1 11 paso,1 - p 1-p1-Probabilidad de p avances2 2Paso 2. ¿Cuál es la probabilidad de que complete con seguridad esta sección del camino?
Idea: Podemos pensar fácilmente en dejar que f [i] sea la probabilidad de ir al i-ésimo punto. Luego está f [i] = f [i - 1] ∗ p + f [i - 2] ∗ (1 - p) f [i] = f [i-1] * p + f [i-2] * (1-p)f [ i ]=f [ yo-1 ]∗pag+f [ yo-2 ]∗( 1-p ) . Pero no podemos ir a donde hay minas terrestres, así que usamos minas terrestres para dividir la carretera.
Suponga que la ubicación de la primera mina esx [1] x [1]x [ 1 ] , luego establecemosf [1] = 1.0 f [1] = 1.0f [ 1 ]=. 1 . 0 , la probabilidad de que la sección de seguridad de la carretera esf [x [1] + 1f [ x [ 1 ]+1 ]=1-f [ x [ 1 ] ] , los siguientes párrafos también asumen que la probabilidad del punto de partida es1 11. Debido a que el punto antes del punto de partida es una mina terrestre y debe pasar de manera segura, en este párrafo debe ir a la siguiente mina terrestre.
Dado que esta ruta es demasiado larga, necesitamos usar la matriz para potenciar rápidamente y optimizar este proceso recursivo.
Código:
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define lowbit(x) x&-x
#define pii pair<int,int>
#define ull unsigned long long
#define pdd pair<double,double>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
int x=0,f=1;
char ch=gc();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=gc();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=gc();
}
return x*f;
}
using namespace std;
const int N=1e4+666;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-7;
//const double PI=acos(-1);
struct node
{
double v[3][3];
};
node mul(node a,node b)
{
node ans;
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
ans.v[i][j]=0.0;
for(int k=1;k<=2;k++)
{
ans.v[i][j]+=a.v[i][k]*b.v[k][j];
}
}
}
return ans;
}
node qpow(node a,int n)
{
node res;
memset(res.v,0,sizeof res.v);
for(int i=1;i<=2;i++)
res.v[i][i]=1.0;
while(n)
{
if(n&1)
res=mul(res,a);
a=mul(a,a);
n>>=1;
}
return res;
}
int a[N];
void solve()
{
int n;
double p;
while(cin>>n>>p)
{
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
node ans;
ans.v[1][1]=p;
ans.v[1][2]=1.0;
ans.v[2][1]=1-p;
ans.v[2][2]=0.0;
double res=1;
a[0]=0;
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1])
continue;
node tt = qpow(ans,a[i]-a[i-1]-1);
res = res*(1-tt.v[1][1]);
}
printf("%.7lf\n",res);
}
}
signed main()
{
// int _;
// cin>>_;
// while(_--)
solve();
return 0;
}