首页 > 其他分享 >sloj#P2104. 猎人杀

sloj#P2104. 猎人杀

时间:2023-06-24 14:34:36浏览次数:45  
标签:int res 猎人 P2104 st 1ll sloj mod

题目大意:

  • \(n\) 个猎人编号为 \(1, 2, \cdots, n\) 依次按逆时针方向排成一个环。
  • 第一枪由你打响,你会向第 \((k - 1) \bmod n + 1 (k>0)\) 号猎人开枪,这个被击中的猎人有 \(\frac 1 2\)​ 的概率会死亡。所有被击中的猎人(无论死活),都会继续向他的逆时针方向开始的第 k kk 个(从他自己的下一个开始数)活着的猎人开枪。
  • 当只剩一个人时游戏停止,无论最后射向他的子弹是否会打死他。
  • 作为编号为 \(1\) 的猎人,想知道自己活到最后的概率。

算法分析:

  • 我们很容易想到从终止状态倒推。
  • 为了方便我们从 \(0\) 开始编号。
  • 可以设计状态 \(f(i,j)\) 表示还剩 \(i\) 个人,其中 \(0\) 号在其中,并且编号为 \(0\),上一枪射中了 \(j\),\(0\) 号能存活到最后的概率。
  • 答案即为 \(f(n,(k-1)\bmod n)\)。
  • 不难根据被射中的这个人是否被打死了,然后转移:

\[\begin{align*} f(i,j) = \begin{cases} \frac{1}{2}(f(i,(i+k) \mod i)+f(i-1,(i+k-1) \mod i) &(i \neq 0))\\ \frac{1}{2}f(i,(i+k) \mod i) &(i = 0) \end{cases} \end{align*} \]

  • 这里的转移形成了分层图,i − 1 i-1i−1 到 i ii 可以直接转移,但是 i ii 层之内的转移形成了若干个环,如果直接用高斯消元,时间复杂度为 \(\mathcal O(n^4)\)。
  • 但是我们发现对于环的形式的转移,可以 \(\mathcal O(n)\) 实现。
  • 对于一个环,我们考虑将所有的数表示为 \(k_ix+b_i\) 的形式,其中 \(x\) 是环中的指定一个值,然后 \(k_i,b_i\) 都是常数,这样我们可以利用这些表达式,把 \(x*\)* 也表达成 \(k′x+b′\),解方程 \(x = k′x+b′\) 即可。
  • 所以时间复杂度优化到 \(\mathcal O(n^2)\)。
#include <bits/stdc++.h>
#define mod 1000000007
#define N 2010
#define inv ((mod+1)>>1)
using namespace std;
int n,k,a[N],b[N],t[N],f[N][N],ne[N];
bool vis[N];
int qpow(int x,int y){
	int res = 1; 
	for(;y;y>>=1,x = 1ll*x*x%mod)
		if(y&1) res = 1ll*res*x%mod; 
	return res; 
}
int main(){
	scanf("%d%d",&n,&k);
	f[1][0] = 1; 
	for (int i = 2;i<=n;i++){
		for (int j = 0;j<i;j++){
			vis[j] = false; 
			ne[(j+k)%i] = j; 
			if(j==0) t[j] = 0;
			else t[j] = 1ll*inv*f[i-1][(j+k-1)%(i-1)]%mod;
		}
		for (int st = 0;st<i;st++){
			if(vis[st]) continue; 
			int u = st; 
			a[st] = 1;
			b[st] = 0;
			vector<int>s; 
			for(;!vis[u];u = ne[u]){
				vis[u] = true; 
				int v = ne[u]; 
				if(v!=st) s.push_back(v);
				a[v] = 1ll*a[u]*inv%mod; 
				b[v] = (1ll*b[u]*inv+t[v])%mod; 
			}
			f[i][st] = 1ll*(mod-b[st])*qpow(a[st]-1,mod-2)%mod; 
			for(auto v : s) f[i][v] = (1ll*a[v]*f[i][st]+b[v])%mod; 
		}
	}
	printf("%d",f[n][(k-1)%n]); 
	return 0; 
}

标签:int,res,猎人,P2104,st,1ll,sloj,mod
From: https://www.cnblogs.com/cztq/p/17501085.html

相关文章

  • slojP2105. 锻造
    题目背景勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自己连一个史莱姆都打不过了。勇者的精灵路由器告诉勇者其实是他自己的武器不好,并把他指引到了锻造厂。题目描述“欢迎啊,老朋友。”一阵寒......
  • SRC赏金猎人—笔记二
    以下是如何将速率限制漏洞的影响从低增加到高甚至严重过程1、我访问了该网站,然后开始在网站的主文件中手动查找main.js2、我发现有一个Web服务托管在http://redacted.com/cloudservice.svc?singleWsdl3、我访问了该端点,发现所有功能都有很好的文档记录,对于每个端点,如果是......
  • [PKUWC2018]猎人杀
    概率的分母在不断变化很麻烦,我们不妨令它可以打到已死的人。由于还活着的人概率之比没有变,显然是不会影响答案的。考虑容斥,设\(p(S)\)表示集合\(S\)中的人在\(1\)后被打的方案数,那么答案就是\(\sum_{S}(-1)^{|S|}p(S)\)。\(p(S)\)实际上就是无限开枪,每次不打\(S\cup\{1......
  • 【心得】Man at Work3--猎人的青春!
    【心得】ManatWork3--猎人的青春! 这是我接触到的第1款3DGAL游戏。里面的5个女孩子:“贾斯丁”,“菲利丝”,“凌小路瑞惠”,“莫妮卡”以及“莉莎”在我没怎么看攻略的情况下,就凭借着一腔热血以及永不消逝的耐心,终于一一攻破了...值得我骄傲的是,我并没有在离“热恋”差1的情况下,存......
  • 「题解」洛谷 P5644 [PKUWC2018]猎人杀
    题意:初始有\(n\)个人,每个人的权值是\(w_i\),假设这一轮剩余还没嘎掉的人总权值是\(s\),那么这一轮它有\(\frac{w_i}{s}\)的概率嘎掉。求\(1\)活到最后的概率是多少。......
  • 【题解】P5644 [PKUWC2018]猎人杀
    供题人是树剖姐姐喵/se思路生成函数+子集反演+分治NTT.首先发现当前打中的猎人倒下之后,后面的猎人被射中的概率会随之变化,也就是说操作是有后效性的,不好处理。有......
  • sloj bzoj2821. L的鞋子
    题目描述L是壕,他非常喜欢鞋子,他专门在他的别墅中修建了一个鞋柜,鞋柜是呈线性的,为了好找鞋子,他把他的鞋子分成了c种。虽然L没有小学毕业,但是对数字非常偏爱,他很忌讳奇数,因......
  • 赏金猎人笔记-手动sqli
      声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。本文选......
  • 赏金猎人笔记-sqli几个小技巧
      几个技巧小结1.查找后台登陆界面:google:“www.target.comlogin”有效率达到60%的一个sqli的payload:2.sqli一个有效载荷:admin'OR1=1--'3.对于类似这种:......
  • 赏金猎人系列-如何测试注册(Sign up)功能III以及相关Tips
      赏金猎人系列-如何测试注册(Signup)功能III以及相关Tips声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部......