2012-C08-team5-problem-F
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cstdio>
#include <algorithm>
using namespace std;
int p,cnt[1<<14],x[100],y[100];
double dp[1<<14],rate[101]={1};
int main(){
int n,m;
scanf("%d%d%d",&n,&m,&p);
for(int i=0;i<m;i++) rate[i+1]=rate[i]*p*0.01;
for(int i=0;i<m;i++){
scanf("%d%d",x+i,y+i);
x[i]--,y[i]--;
}
int mask=(1<<n)-1;
for(int s=0;s<=mask;s++) for(int i=0;i<m;i++)
if((1<<x[i]&s) && (1<<y[i]&s)) cnt[s]++;
for(int s=0;s<=mask;s++){
dp[s]=1;
for(int r=(s-1)&s;r>(s^r);r=(r-1)&s)
dp[s]-=dp[r]*rate[cnt[s]-cnt[r]-cnt[s^r]];
}
printf("%.12f\n",dp[mask]);
}
}}}
#include <cstdio>
#include <algorithm>
using namespace std;
int p,cnt[1<<14],x[100],y[100];
double dp[1<<14],rate[101]={1};
int main(){
int n,m;
scanf("%d%d%d",&n,&m,&p);
for(int i=0;i<m;i++) rate[i+1]=rate[i]*p*0.01;
for(int i=0;i<m;i++){
scanf("%d%d",x+i,y+i);
x[i]--,y[i]--;
}
int mask=(1<<n)-1;
for(int s=0;s<=mask;s++) for(int i=0;i<m;i++)
if((1<<x[i]&s) && (1<<y[i]&s)) cnt[s]++;
for(int s=0;s<=mask;s++){
dp[s]=1;
for(int r=(s-1)&s;r>(s^r);r=(r-1)&s)
dp[s]-=dp[r]*rate[cnt[s]-cnt[r]-cnt[s^r]];
}
printf("%.12f\n",dp[mask]);
}