首页 > 其他分享 >P5165 xtq的棋盘 题解

P5165 xtq的棋盘 题解

时间:2024-09-28 16:12:07浏览次数:8  
标签:ch bas xtq 题解 times P5165 ans KSM mod

这个题也可以用矩阵加速解决。

先考虑 70pts 的做法,我们设 \(f_i\) 为从 \(i\) 位置到达 \(0\) 的期望步数,并尝试用 \(f_n\) 表示出所有 \(f_i\) 并利用 \(f_0\) 解出 \(f_n\) 然后回带即可。

具体地,设 \(f_i = a \times f_n + b\),\(f_{i-1} = c \times f_n +d\),则由于:

\[f_i = prb \times f_{i-1} + (1 - prb) \times f_{i+1} +1 \]

所以:

\[\begin{align*} f_{i+1} & = f_i - prb \times f_{i-1} - 1 \\ & = (a - prb \times c) \times f_n + (b - prb \times d + 1) \end{align*} \]

直接计算出 \(f_0\) 和 \(f_n\) 的关系,然后暴力算即可,复杂度 \(O(n)\)。

怎么优化呢?

注意到上面的 \(a,b,c,d\) 和新的两个系数都是线性的关系,可以直接用矩阵加速递推,时间复杂度 \(O(\log n)\)。

#include<bits/stdc++.h>
using namespace std;
inline void rd(){}
template<typename T,typename ...U>
inline void rd(T &x,U &...args){
	char ch=getchar();
	T f=1;x=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	x*=f;rd(args...);
}
const int mod=1e9+7,N=1e6+5;
int n,m,p,q,ip;
struct Matrix{
	int m[3][3];
	Matrix(){memset(m,0,sizeof m);}
	Matrix(int x){
		memset(m,0,sizeof m);
		m[0][0]=m[1][1]=m[2][2]=x;
	}
	Matrix friend operator*(Matrix a,Matrix b){
		Matrix c;
		for(int k=0;k<3;k++)
			for(int i=0;i<3;i++)
				for(int j=0;j<3;j++)
					(c.m[i][j]+=1ll*a.m[i][k]*b.m[k][j]%mod)%=mod;
		return c;
	}
}; 
inline int KSM(int x,int n){
	int ans=1;
	while(n){
		if(n&1)ans=1ll*ans*x%mod;
		x=1ll*x*x%mod;
		n>>=1;
	}
	return ans;
}
inline Matrix KSM(Matrix x,int n){
	if(n<0)return Matrix(0);
	Matrix ans=Matrix(1);
	while(n){
		if(n&1)ans=ans*x;
		x=x*x;
		n>>=1;
	}
	return ans;
}
int A,B,Am,Bm,ans;
signed main(){
	rd(n,m,p,q);
	p=1ll*p*KSM(q,mod-2)%mod;
	ip=KSM(p,mod-2);
	Matrix bas,ch;
	ch.m[0][0]=ip,ch.m[0][1]=1;
	ch.m[1][0]=1ll*(p-1)*ip%mod;
	bas.m[0][0]=bas.m[0][1]=1;
	A=(bas*KSM(ch,n-1)).m[0][0];
	Am=(bas*KSM(ch,n-m-1)).m[0][0];
	ch.m[2][2]=1,ch.m[2][0]=(mod-ip);
	bas.m[0][0]=mod-1,bas.m[0][1]=0,bas.m[0][2]=1;
	B=(bas*KSM(ch,n-1)).m[0][0];
	Bm=(bas*KSM(ch,n-m-1)).m[0][0];
	ans=1ll*(mod-B)*KSM(A,mod-2)%mod;
	if(n==m)return printf("%d\n",ans),0;
	ans=(1ll*Am*ans%mod+Bm)%mod;
	printf("%d\n",ans);
	return 0;
}


标签:ch,bas,xtq,题解,times,P5165,ans,KSM,mod
From: https://www.cnblogs.com/11-twentythree/p/18432480

相关文章

  • Codeforces Round 975 (Div. 2) 题解:D、E
    第一次进前50,上分最爽的一次D.Speedbreaker对\(a\)按照时间升序排序,不难发现,对于升序排序后的数组,当我们搜到时间\(t\)时,记录已经搜过的时间对应原城市编号最小值为\(l\),最大值为\(r\),则我们一定要在\(a_t\)时间之前走过所有\([l,r]\)之间的城市。则若\(r-l+1>a_t\)则无解,因......
  • [USACO22DEC] Breakdown P 题解
    T1[USACO22DEC]BreakdownP比较显然的一点是,一次加一条边/一次删一条边,显然转化,这是显然的一条套路。这题的\(K\le8\),很有意思的数据范围,然后调用我们聪明的人类大脑得知需要用到折半搜索。所以我们只考虑\(K\le4\)的情况,令\(\mathit{st}\)表示折半搜索中考虑的起点。维......
  • [NOIP2017 提高组] 奶酪 题解
    题目背景NOIP2017提高组D2T1题目描述现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为 z=0,奶酪的上表面为 z=h。现在,奶酪的下表面有一只小老鼠Jerry,......
  • 洛谷P1827 [USACO3.4] 美国血统 题解
    上题目:题目描述农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而不是用图形的方法。你的任务是在被给予奶牛家谱的“树中序遍历”和......
  • 洛谷P1162 填涂颜色题解
    老规矩上题目:题目描述由数字 00 组成的方阵中,有一任意形状的由数字 11 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×66×6 的方阵(n=6n=6),涂色前和涂色后的方阵如下:如果从某个 00 出发,只向上下左右 44 个方向移动且仅经过其他 00 的情况下,无法......
  • 题解 HZOJ 284 超市卖货 C/C++
    题目传送门:超市卖货-题目-OnlineJudge(haizeix.com)https://oj.haizeix.com/problem/284思路:每次寻找价格最高的商品,并尝试卖掉它:寻找未卖出商品的日期,优先锁定其保质期最后一天,若该日期已卖出则继续向前寻找能找到未卖出商品的日期时,收入增加,标记该日期代码实现:为......
  • Echarts图表知识点汇总及请求django服务器后端跨域问题解决
    1.引入echartsvue3中通过npm引入:npminstallecharts--saveimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text:'ECha......
  • P9019 [USACO23JAN] Tractor Paths P 题解
    P9019[USACO23JAN]TractorPathsP题解难度其实绝对不止蓝题。先考虑第一问。维护任意两点之间的最短路是困难的,难以dp或是采取其它方法解决。难以算最短路就转换思路,考虑从\(x\)走\(p\)步能走到哪。考虑到这个东西是有单调性的,也就是说对于\(x<y<z\),从\(x\)能走到......
  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......