首页 > 其他分享 >CF1662C European Trip

CF1662C European Trip

时间:2023-08-24 21:25:29浏览次数:57  
标签:CF1662C 矩阵 times deg bmatrix European DEG Trip Matrix1

CF1662C European Trip

感觉很不错的矩阵乘法加速题。

从 \(n,k\) 的数据范围大致可以看出是矩阵乘法加速递推。

设 \(f_{k,u,v}\) 表示从 \(u\) 走到 \(v\) 走了 \(k\) 步的合法方案数,初始状态 \(f_1\) 即为邻接矩阵,最终答案为 \(\sum_{i=1}^{n} f_{k,i,i}\)。

正常的转移方程为 \(f_{k,u,v}=\sum_{l=1}^{n}f_{k-1,u,l} \times f_{0,l,v}\),考虑加入限制。

一条边 \((u,v)\) 在被第 \(k-1\) 步时从 \(u\) 走到 \(v\),然后第 \(k\) 步又走了回来,那么第 \(k-2\) 步一定会走到 \(u\) 节点。所以我们转移到底 \(k\) 步时先正常的从 \(k-1\) 转移过来,然后选择在第 \(k-2\) 步时加一些限制条件,减去不合法的方案数,这样所有不合法的方案就会被不重不漏的减去。

设第 \(k-2\) 步时 走过的边是 \((x,u)\),第 \(k-1\) 步不能走回 \(x\),因为这种情况在转移 \(k-1\) 时已经被减去了,所以非法方案是从 \(u\) 走到 \(1,2,3,4\) 四个点然后走回来一共四种情况,即为 \(f_{k-2,u,v} \times (deg_u-1)\)

所以最终的转移方程为

\[f_{k,u,v}=\sum_{l=1}^{n}f_{k-1,u,l} \times f_{1,l,v}-f_{k-2,u,v} \times (deg_v-1) \]

考虑优化,\(f_k\) 是一个矩阵的形式,变形一下:

\[f_k=f_{k-1} \times f_1-f_{k-2} \times (DEG-I) \]

其中 \(DEG_{i,i}=deg_i\),其余为 \(0\)。

是线性递推形式,用矩阵快速幂优化。

\[\begin{bmatrix} f_{k-1},f_{k-2} \end{bmatrix} \times \begin{bmatrix} f_1,I\\ DEG-I,0 \end{bmatrix} = \begin{bmatrix} f_{k},f_{k-1}\\ \end{bmatrix} \]

注意当 \(k=2\) 时 \( f_k=f_{k-1} \times f_1-f_{k-2} \times DEG\),度数不需要减 \(1\),因为第 \(k-2\) 步并没有从一个 \(x\) 走到 \(u\)。

本题的精髓在于如何不重不漏考虑不合法的方案数,矩阵乘法加速的是外层的递推,只不过里面的转移恰好又需要用到矩阵乘法,需要搞清楚两个矩乘的关系。

核心代码如下:

int n,m,q,deg[100];
struct Matrix1{int f[100][100];};
struct Matrix2{Matrix1 f[2][2];}a;
struct Line2{Matrix1 f[2];}b;
Matrix1 operator *(const Matrix1 m1,const Matrix1 m2)
{
	Matrix1 m3;memset(m3.f,0,sizeof(m3.f));
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n;++j)
		{
			for(int k=0;k<n;++k)
			m3.f[i][j]=(m3.f[i][j]+m1.f[i][k]*m2.f[k][j])%MOD;
		}
	}
	return m3;
}
Matrix1 operator +(const Matrix1 m1,const Matrix1 m2)
{
	Matrix1 m3;memset(m3.f,0,sizeof(m3.f));
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n;++j)
		m3.f[i][j]=(m1.f[i][j]+m2.f[i][j])%MOD;
	}
	return m3;
}
Matrix2 operator *(const Matrix2 m1,const Matrix2 m2)
{
	Matrix2 m3;memset(m3.f,0,sizeof(m3.f));
	for(int i=0;i<2;++i)
	{
		for(int j=0;j<2;++j)
		{
			for(int k=0;k<2;++k)
			m3.f[i][j]=m3.f[i][j]+m1.f[i][k]*m2.f[k][j];
		}
	}
	return m3;
}
Line2 operator *(const Line2 m1,const Matrix2 m2)
{
	Line2 m3;memset(m3.f,0,sizeof(m3.f));
	m3.f[0]=m1.f[0]*m2.f[0][0]+m1.f[1]*m2.f[1][0];
	m3.f[1]=m1.f[0]*m2.f[0][1]+m1.f[1]*m2.f[1][1];
	return m3;
}
inline void mian()
{
	read(n,m,q),q-=2;int x,y,ans=0;
	while(m--)read(x,y),++deg[x-1],++deg[y-1],b.f[1].f[x-1][y-1]=b.f[1].f[y-1][x-1]=a.f[0][0].f[x-1][y-1]=a.f[0][0].f[y-1][x-1]=1;
	b.f[0]=b.f[1]*b.f[1];
	if(q==-1){for(int i=0;i<n;++i)ans+=b.f[1].f[i][i];write(ans%MOD);return;}
	for(int i=0;i<n;++i)a.f[0][1].f[i][i]=1,a.f[1][0].f[i][i]=1-deg[i]+MOD,b.f[0].f[i][i]=0;
//		for(int i=0;i<n;++i,puts(""))for(int j=0;j<n;++j)write(b.f[0].f[i][j]);
	for(;q;q>>=1,a=a*a)if(q&1)b=b*a;
	for(int i=0;i<n;++i)ans+=b.f[0].f[i][i];
	write(ans%MOD);
}

标签:CF1662C,矩阵,times,deg,bmatrix,European,DEG,Trip,Matrix1
From: https://www.cnblogs.com/WrongAnswer90-home/p/17655173.html

相关文章

  • Codechef - N Triplets(构造+观察)
    题目大意  对于一个正整数N,需要找到三个不同的数字A,B,C,使得三个数当中任意两个数字相乘都是N的约数,另外还要使得A,B,C三个数字乘积是N的整数倍数。最后输出三个数字(如果有多种组合,输出任意一种即可),如果找不到满足条件的则输出-1。 思路  注意到1必然是其中一个约数,另外我们......
  • POJ 1041 John's trip
    \(POJ\)\(1041\)\(John's\)\(trip\)一、题目大意多组数据,输入\(x,y,z\),表示结点\(x\)和结点\(y\)之间有一条序号为\(z\)的边,如果这个无向图中存在欧拉回路,就输出字典序最小的欧拉回路,如果不存在欧拉回路就输出Roundtripdoesnotexist.。当输入00表示一组数据输入结束......
  • Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务
    作者:刘军全新升级的Triple协议在微服务协议选型方面我们看到越来越多的应用从Dubbo2TCP二进制协议迁移到Dubbo3Triple协议(兼容gRPC),以充分利用Triple的高效、全双工、Streaming流式通信模型等能力;Triple+HTTP/2的组合很好的解决了后端服务穿透性等问题,但在阿里及......
  • CF1662C European Trip
    CF1662CEuropeanTrip没有限制怎么做?邻接矩阵\(k\)次方。有限制?设\(A\)为邻接矩阵,\(I\)为单位矩阵,\(deg_u\)为\(u\)的度数,步数为\(k\)是的答案矩阵\(R_k\),即\(R_k[u][v]\)应该表示\(u\tov\)长度为\(k\)的合法路径条数。如果我们知道了\(R_1,R_2,\dots,R_......
  • L11U3-1-Planning a trip
    PlanningatripDialogue1.I'vebeenplanningthisforsolong.2.I'mgoingtoAmerica.3.I'mplanningtohitallthebigcities.4.Iintendtogoforabouttwoweeks.5.I'vedecided...做计划用这些表达方式来谈论一个tentative(暂时的)计划。在动词think后,你可以......
  • CodeForces 605E Intergalaxy Trips 题解
    题意有一张\(n\)个点的有向完全图,边\(i\toj\)有\(p_{i,j}\)的概率出现(\(p_{i,i}=1\))。你要从\(1\)开始,每天可以走一条出边或留在原地,求最优策略下走到\(n\)的期望天数。输出小数(不取模)。\(n\le10^3\)思路设\(f(i)\)表示从\(i\)走到\(n\)的期望天数,那么......
  • Proj. CAR Paper Reading: Debin: Predicting Debug Information in Stripped Binarie
    Abstract本文:Debin任务:recoveringsymbolnames,typesandlocations方法:useescalablestructuredpredictionalgorithmsinprobabilisticgraphicalmodelswithanextensivesetoffeaturestodistinguishthenameandthetypeofkeyelementsextractedsucha......
  • [rk3568]linux strip后可执行程序太大
    查看GCC工具是否存在优化,或者未优化导致,$CC -Q--help=optimizers查看开启的程度,如果有很多disable未进行优化像,在makefile中增加-O0,极度优化状态进行Thefollowingoptionscontroloptimizations:-O<number>-Ofast-Og-Os-faggressive-loop-optimizations......
  • [LeetCode] 2475. Number of Unequal Triplets in Array
    Youaregivena 0-indexed arrayofpositiveintegers nums.Findthenumberoftriplets (i,j,k) thatmeetthefollowingconditions:0<=i<j<k<nums.lengthnums[i], nums[j],and nums[k] are pairwisedistinct.Inotherwords, nums[i]!=......
  • Codeforces Round #416 (Div. 2)-C. Vladik and Memorable Trip
    原题链接C.VladikandMemorableTriptimelimitpertestmemorylimitpertestinputoutputVladikoftentravelsbytrains.HerememberedsomeofhistripsespeciallywellandIwouldliketotellyouaboutone......