https://scut.online/p/254

思路很清晰,写起来很恶心。

#include<bits/stdc++.h>
using namespace std;
#define ll long long int dp[<<];
//dp[k] 从状态k开始直到k=0还需要的期望次数 0表示炸弹已爆炸,1表示炸弹未爆炸
int x[];
int y[];
int r[]; int pa[]; ll n;
ll invn;
int all1; int vis[]; bool canboom(int id,int id2){
return (1ll*r[id]*r[id])>=(1ll*(x[id]-x[id2])*(x[id]-x[id2])+1ll*(y[id]-y[id2])*(y[id]-y[id2]));
} void dfs(int id){
vis[id]=;
for(int i=;i<n;i++){
if(vis[i]==&&(canboom(id,i))){
dfs(i);
}
}
} void find_pa(int id){
memset(vis,,sizeof(vis)); dfs(id);
//把自己引爆; //cerr<<"boom:"<<id<<" can boom: \n";
/*for(int i=0;i<n;i++){
cerr<<vis[i];
}
cout<<endl;*/ int ans=all1;
//假设所有炸弹都能被引爆
for(int i=;i<n;i++){
if(vis[i]){
//从左往右的第i个不能被引爆
//0 1 2 3
//二进制的低位都是在右边
//3 2 1 0
ans&=(~(<<i));
//&=1110111设为0,该炸弹不能被引爆
//cout<<bitset<3>(~(1<<(n-1-i)))<<endl;
} }
//cout<<bitset<3>(ans)<</*"!"<<*/endl;
pa[id]=ans;
} int p=; //快速幂 x^n%p
ll qpow(ll x,ll n) {
ll res=;
while(n) {
if(n&)
res=res*x%p;
x=x*x%p;
n>>=;
}
return res%p;
//要记得模p,否则输入一个2的幂次模1就挂了
} //乘法逆元 快速幂+费马小定理 模必须是质数
ll inv(ll n) {
return qpow(n,p-);
} int count0(int k){
int cnt=;
for(int i=;i<n;i++){
if(!(k&))
cnt++;
k>>=;
}
return cnt;
} int fdp(int k){
//cout<<"[fdp]="<<" "<<bitset<3>(k)<<endl;
if(dp[k]!=-){
//cerr<<" dp["<<k<<"]="<<dp[k]<<endl;
return dp[k];
} int cnt0=count0(k); //cout<<"k="<<k<<" cnt0="<<cnt0<<endl;
ll ans=; for(int i=;i<n;i++){
if(k&(<<i)){
//cout<<"i="<<i<<endl;
//k的右起第i位,第i个炸弹没被引爆
int can=pa[i];
//第i个炸弹把can为1的这些都引爆,也就是把can为1的设成0
//cout<<"can="<< bitset<3>(can)<<endl;
ans+=(fdp(k&(can)))*invn;
//cerr<<" tmp ans="<<ans<<endl;
ans%=p;
}
} ans+=;
ans%=p; //cerr<<" tmp dp["<<k<<"]="<<ans<<endl; ans*=n;
ans%=p; ans*=inv(n-cnt0);
ans%=p;
//cerr<<" dp["<<k<<"]="<<ans<<endl;
return dp[k]=ans;
} int main(){
//cout<<"inv2="<<inv(2)<<endl;
while(~scanf("%lld",&n)){
invn=inv(n); for(int i=;i<n;i++){
scanf("%d%d%d",x+i,y+i,r+i);
} all1=;
for(int i=;i<n;i++){
all1<<=;
all1|=;
} for(int i=;i<n;i++){
//cerr<<"!";
find_pa(i);
} memset(dp,-,sizeof(dp)); dp[]=;//所有炸弹都爆炸了 //求dp[all1] //cout<<bitset<3>(all1)<<endl; printf("%d\n",fdp(all1));
}
}

最新文章

  1. sha256 C语言
  2. osgEarth基础入门
  3. nyoj 84 阶乘的0
  4. cocos2d-x 3.2 例子文件工程的位置
  5. python笔记之中缀语法和管道实现
  6. MySQL函数大全【转载】
  7. Octave Tutorial(《Machine Learning》)之第四课《绘图数据》
  8. springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)
  9. vue--&quot;卡片层叠&quot; 组件 开发小记
  10. Neo4j安装
  11. 工作经验-类型转换[ java.lang.String]
  12. bzoj 4621: Tc605 动态规划
  13. python写入excel(xlswriter)--生成图表
  14. scp免密操作
  15. [codechef July Challenge 2017] IPC Trainers
  16. java基础-基础语法
  17. Python3学习之路~2.5 简单的三级菜单程序
  18. 排序-----插入排序(python版)
  19. 【总结】前端框架:react还是vue?
  20. 夜神安卓模拟器adb命令详解

热门文章

  1. Monkey源代码分析之事件注入
  2. Golang之bytes.buffer
  3. INAPP登陆调用的FB接口
  4. NVIDIA---CUDA
  5. 01背包+卡精度 Hdu 2955
  6. nyoj 题目10 skiing —— 南阳oj
  7. 基于mac系统的apacheserver的使用流程
  8. 【健康生活】Google、百度之间的选择
  9. Kafka知识点汇总
  10. block-循环引用