EVERYTHING HAPPENS FOR T|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-04-12 23:37阅读: 37评论: 0推荐: 0

abc247_f Cards 题解

Cards

题意

N 张卡片,每张卡片上都写有两个数字,第 i 张卡片上的数字分别为 Pi,Qi

同时,P=(P1,P2,,PN)Q=(Q1,Q2,,QN) 都是 (1,2,,N) 的全排列。

我们需要在 N 张卡片中选出一些卡片,并且 1,2,,N 都出现在至少一张选出的卡片上。

请求出选卡片的方法数,答案对 998244353 取模

数据范围

  • 1N2×105
  • 1Pi,QiNPQ(1,2,,N) 的全排列。

思路

这题需要一定的联想能力。

首先,这些卡牌可以看作构成了一个图,每次将 PiQi 连边,可以发现必然会出现环,每个环的方案数就是选择环上的某些边使得环分成的每个连通块的大小都不小于 2 的方案数。

环与环之间都是独立的,所以要用乘法原理。

问题是,怎样求出每个环的方案数呢?

首先,我们有一个小小的环。

然后,我们先来整一个 dp

  • 环的大小为 i,令大小为 i 的环的方案数为 fi
    • dpi,0,边 1 和边 i 都不选,不合法。
    • dpi,1,选边 i 而不选边 1dpi,1=dpi1,1+dpi2,1
    • dpi,2,选边 1 而不选边 idpi,2=dpi1,3
    • dpi,3,边 1i 都选。dpi,3=dpi1,3+dpi2,3
  • 那么,fi=dpi,1+dpi,2+dpi,3=dpi1,1+dpi2,1+dpi1,3+dpi1,3+dpi2,3=(dpi1,1+dpi1,3+dpi1,2)+(dpi2,1+dpi2,3+dpi3,3)=fi1+(dpi2,1+dpi2,3+dpi2,2)=fi1+fi2(备注:dpi2,3=dpi1,2,dpi3,3=dpi2,2
  • 特别的,通过手推我们发现 f1=1,f2=3

fi 递推一下即可。

复杂度

  • 时间:O(n)
  • 空间:O(n)

Code

点击查看代码
#include <iostream>
using namespace std;
const int N = 2e5 + 10, mod = 998244353;
int n, a[N], b[N], f[N], dp[N];
long long ans = 1;
int dfs (int x) { // 找环
if (f[x]) { // 找到重复点了
return 0;
}
f[x] = 1;
return dfs(b[x]) + 1;
}
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[a[i]];
}
dp[1] = 1, dp[2] = 3; // f数组的递推
for (int i = 3; i <= n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % mod; // 记得取模
}
for (int i = 1; i <= n; i++) {
if (!f[i]) {
ans = ans * dp[dfs(i)] % mod; // 乘法原理
}
}
cout << ans;
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17311509.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(37)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
平凡之路 (Live版) - 朴树
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 朴树/韩寒

作曲 : 朴树

编曲 : 朴树

徘徊着的 在路上的

你要走吗 via via

易碎的 骄傲着

那也曾是我的模样

沸腾着的 不安着的

你要去哪 via via

谜一样的 沉默着的

故事你真的在听吗

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

当你仍然

还在幻想

你的明天 via via

她会好吗 还是更烂

对我而言是另一天

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着也渴望着

也哭也笑平凡着

jia do

la so

哦~

向前走 就这么走

就算你被给过什么

向前走 就这么走

就算你被夺走什么

向前走 就这么走

就算你会错过什么

向前走 就这么走

就算你会

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着 渴望着 也哭也笑平凡着

我曾经跨过山和大海

也穿过人山人海

我曾经问遍整个世界

从来没得到答案

我不过像你像他像那野草野花

冥冥中这是我 唯一要走的路啊

时间如烟

如此这般

明天已在 via via

风吹过的 路依然远

你的故事讲到了哪

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示