首页 > 其他分享 >[ABC212E] Safety Journey 题解

[ABC212E] Safety Journey 题解

时间:2023-06-12 19:56:50浏览次数:45  
标签:idx int 题解 sum Journey Safety include

Safety Journey

题目大意

给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量:

  • \(A\) 的长度为 \(k+1\)。
  • \(A_0=A_k=1\)。
  • \(\forall 0\le i\le k-1\),点 \(A_i\) 和点 \(A_{i+1}\) 之间存在边。

思路分析

图上计数,考虑 DP。

设 \(f_{i,j}\) 表示考虑到路径上的第 \(i\) 个点(从 \(0\) 开始),当前位于点 \(j\) 的方案数。

那么所求的就是 \(f_{k,1}\)。

考虑状态转移,因为给出的是原图的补图,所以可以列出方程:

\[f_{i,j}=\sum_{k=1}^nf_{i-1,k}-\sum_{v\in e_j}f_{i-1,v}-f_{i-1,j} \]

其中,\(e_i\) 表示点 \(i\) 在补图中的出点集合。

容易发现,前半部分可以通过记录前缀和的方式优化掉,所以就做完了,时间复杂度和空间复杂度均为 \(O(n^2)\)(视 \(n,m\) 同阶),也可以通过滚动数组将空间优化到 \(O(n)\),但无所谓了。

代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
const int N=10100,M=5050,mod=998244353;
#define int long long

int to[N],nxt[N],head[N];
int idx=1,n,m,k,in1,in2,sum;
int f[M][M];

void add(int u,int v){
    idx++;to[idx]=v;nxt[idx]=head[u];head[u]=idx;
}

signed main(){
    scanf("%lld%lld%lld",&n,&m,&k);
    for(int i=1;i<=m;i++){
        scanf("%lld%lld",&in1,&in2);
        add(in1,in2);add(in2,in1);
    }
    f[0][1]=1;//第 0 天在点 1 有一种方案
    for(int i=1;i<=k;i++){
        sum=0;
        for(int s=1;s<=n;s++) sum+=f[i-1][s];//记录和
        for(int s=1;s<=n;s++){
            f[i][s]=sum-f[i-1][s];
            for(int j=head[s];j;j=nxt[j]){
                int v=to[j];
                f[i][s]-=f[i-1][v];//依次减去
            }
            f[i][s]%=mod;
        }
    }
    cout<<f[k][1]<<'\n';
    return 0;
}

标签:idx,int,题解,sum,Journey,Safety,include
From: https://www.cnblogs.com/TKXZ133/p/17475974.html

相关文章

  • Codeforces Round 877 (Div.2) 题解 A - D
    A.BlackboardList题目大意起初黑板上有两个数,现在不断选取两个数作出他们俩差的绝对值并写在黑板上,如此往复直到黑板上有\(n\)个数。现在给定这\(n\)个数,问起初两数的其中一个数是多少。解题思路我们分两种可能:要么这两个数有负数,要么没有。有负数的情况,因为每次写下......
  • Codeforces Round #374 (Div. 2)-C. Journey
    原题链接C.JourneytimelimitpertestmemorylimitpertestinputoutputRecentlyIrinaarrivedtooneofthemostfamouscitiesofBerland —theBerlatovcity.Thereare......
  • P1707 刷题比赛 题解
    多少有点混乱邪恶。题意:给出递推式:\[a_1=b_1=c_1=1\\a_2=b_2=c_2=3\\\begin{aligned}a_k&=p\timesa_{k-1}+q\timesa_{k-2}&+b_{k-1}+c_{k-1}&+r(k-2)^2+t(k-2)+1\\b_k&=u\timesb_{k-1}+v\timesb_{k-2}&+a_{k-1}+c_{k-1}&+w^{k-2}\\c......
  • P1306 斐波那契公约数 题解
    请求出\(f_n\)与\(f_m\)的最大公约数,即\(\gcd(f_n,f_m)\),答案对\(10^8\)取模。结论:\(\gcd(f_n,f_m)=f_{\gcd(n,m)}\)证明如下:首先引理1:\[f_{n+m}=f_{n-1}\timesf_{m}+f_{n}\timesf_{m+1}\]运用归纳法,可以简单证明,此处略去。引理2:\[\gcd(f_n,f_......
  • AtCoder Beginner Contest 305 题解
    https://atcoder.jp/contests/abc305/tasks_printE-ArtGalleryonGraph冷知识:md这题赛时没做出来/cy刚看到题:这是什么题啊,\(K,h\)都\(1e5\)能做吗/fn确实能做。考虑类似SPFA的操作。设\(a_x\)表示\(x\)还可以对距离最多为\(a_x\)的点产生贡献,然后就直接......
  • Codeforces Round 876 Div2 A-D题解
    CodeforcesRound876Div2A-D题解A.TheGoodArray这个题就是问你对于\(i\leqn\),要求前面后面至少\(ceil(\frac{i}{k})\)个1那我们就贪心的每k个放一个1,或者直接用数学算一下就好了AC代码#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • 杂题题解
    序列变化(exchange)只要第一位确定,后面的\(n-1\)位都是唯一确定的。因为具体是B还是C只取决于两侧字母是否一样,所以两种变化方案其中一种是另一种每一位取反,要么都合法,要么都不合法。但变化出的方案可能不能继续变化下去,比如CCC变化到BBB之后就不能再变化了,但变化到CCC......
  • permu题解(树上莫队)(非正解)
    题目传送门题意给出一个长度为$n$的排列$P(P1,P2,...Pn)$,以及$m$个询问。每次询问某个区间$[l,r]$中,最长的值域连续段长度。思路首先这道题事求连续段的长度,打个莫队先#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;namespaceTestify{ inlineint......
  • mysql运行sql文件时,timestamp默认值出错问题解决
    出现了---Invaliddefaultvaluefor'reward_time' 直接打开sql文件,将字段reward_time类型值替换成NULL即可 ......