首页 > 其他分享 >题解:AT_abc372_f [ABC372F] Teleporting Takahashi 2

题解:AT_abc372_f [ABC372F] Teleporting Takahashi 2

时间:2024-09-22 15:26:22浏览次数:1  
标签:Teleporting int 题解 复杂度 左移 cge back num Takahashi

题意

给出一个 \(n\) 个点的有向图,点 \(i\) 连向点 \((i+1)\),点 \(n\) 连向点 \(1\)。再给你 \(m\) 条额外边。你的初始位置为 \(1\),问你移动 \(k\) 步的不同方案数(仅当路径不同时两个方案不同)。

思路

先想怎样暴力转移,显然移动 \(k\) 步到达一个点的方案数为所有跟这个点连边的移动 \((k-1)\) 步到达的点的方案数的总和,时间复杂度 \(O((n+m)k)\),显然不能接受。
可以发现 \(m\le 50\),考虑优化掉 \(n\)。最开始的 \(n\) 条初始边构成了一个环,所以每个点 \(i\) 都一定会从 \((i-1)\) 转移过来,也就是环上的数整体右移一位。我们换位思考,不去右移环上的数,而是整体左移一位额外边上的数,时间复杂度就会大大减小了。因为最外圈是个环,所以整体左移额外边虽然会改变连边关系,但是不会改变边的相对位置,对答案不会造成影响。时间复杂度 \(O(mk)\),可以通过。

代码

#include<bits/stdc++.h>
#define md 998244353
using namespace std;
int n,m,k,num[200005],ANS;
vector<int> t[200005],pt;
int to(int x,int i){//将点x左移i位,注意取模
	return ((x-i-1)%n+n)%n+1;
}
signed main(){
	cin>>n>>m>>k;
	num[1]=1;
	for(int x,y,i=1;i<=m;i++){
		cin>>x>>y;
		if(!t[x].size())
			pt.push_back(x);
		t[x].push_back(y);
	}
	for(int i=0;i<k;i++){//这里先从额外边转移再整体左移,所以i从0开始
		vector<pair<int,int>> cge;
		for(int v:pt)
			for(int v2:t[v])
				cge.push_back({num[to(v,i)],to(v2,i+1)});//因为整体左移,所以从原来的u->v变为了u->(v-1)
		for(pair<int,int> v:cge)
			num[v.second]=(1ll*num[v.second]+v.first)%md;
	}
	for(int i=1;i<=n;i++)
		ANS=(ANS+num[i])%md;
	cout<<ANS;
	return 0;
}

标签:Teleporting,int,题解,复杂度,左移,cge,back,num,Takahashi
From: https://www.cnblogs.com/WuMin4/p/18425346

相关文章

  • 题解:AT_abc372_e [ABC372E] K-th Largest Connected Components
    博客内食用更佳这道题的\(k\le10\)其实没什么用,代码区别仅在于手写平衡树和使用内置容器。这道题让查询与一个节点相连的所有点的信息,所以不难想到并查集。又因为让查询第\(k\)大,所以不难想到平衡树和线段树启发式合并。至此思路明显。我们对并查集中的每个节点开一个平......
  • 题解:AT_abc372_c [ABC372C] Count ABC Again
    博客内食用更佳乍一看好像是数据结构。我们结合题目所求内容考虑。对于每次修改,能对答案产生影响的最多只能是当前字符向前和向后延伸\(2\)个元素所构成的长为\(5\)的子串。那么我们先\(\mathcal{O}(n)\)计算出来初始答案。每次修改的时候,不妨先把\(i-2\simi\)和\(i-......
  • 第31次CCF-CSP认证考试 第一题 坐标变换(其一)满分题解
    第31次CCF-CSP认证考试第一题坐标变换(其一)写在前面的话这道题偏简单,我们废话不多说,直接上代码。老系统的链接:旧系统(不过只有第三十二次以及之前的,第三十三及以后的只能在新系统里提交查看分数)。代码#include<iostream>usingnamespacestd;intmain(){ intn,m; ......
  • 正方形计数 题解
    题意简述给出一个\(n\timesn\)的格点平面,有\(q\)次询问,求有多少正方形以\((x,y)\)为某一顶点,满足这个正方形顶点均在格点上,且边长为有理数。\(l\leq10^5\),\(q\leq5\times10^5\)。题目分析看到边长为有理数,想到「毕达哥拉斯三元组」("Pythagoreantriple",简称「......
  • CF 231 E Cactus 题解(仙人掌图上找环)
    codeforces提交记录题意有一个点仙人掌图(每个点都只属于至多一个简单环),给出kkk个询问,问点x......
  • 记一次ctf题解(rsa简单部分)
    一.ctfshow1.babyrsaimportgmpy2fromCrypto.Util.numberimport*e=65537p=104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816......
  • B4033 [语言月赛 202409] 考试 题解
    存下输赢代价,计算时先减为平局,判断输赢,如果还是输,那继续加一变为胜利这局,判断输赢。#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e6+10;intn;inta[N];intb[N];intc[N];intmain(){ios::sync_with_stdio(false); cin>>n......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛完善程序(33-42)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>#include<vector>usingnamespacestd;boolisSquare(intnum){ inti=__1__; intbound=__2__......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛阅读程序(16-32)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;boolisPrime(intn){ if(n<=1){ returnfalse; } for(inti=2;......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛单项选择(1-15)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客第1题32位int类型的存储范围是()A.-2147483647~+2147483647B.-2147483647~+2147483648C.-2147483648~+2147483647D......