首页 > 其他分享 >Atcoder Regular Round #151 B题 A < AP 题解

Atcoder Regular Round #151 B题 A < AP 题解

时间:2022-10-23 09:12:05浏览次数:56  
标签:151 Atcoder int 题解 vis 1ll ans

题意:给定一个排列 \(p\),求满足下列条件的 \(a\) 数组的数量。

  • \(1\le a_i\le m\)。

  • \(a\) 数组的字典序小于 \(\{a_{p_1},a_{p_2},\cdots,a_{p_n}\}\)。

题解:

由于每一个 \(a < a_p\) 的方案都可以反过来变成 \(a > a_p\),那么只需要计算 \(a = a_p\) 的方案数即可。

如果 \(a = a_p\),那么 \(a_i = a_{p_i}\),\(i\) 和 \(p_i\) 之间连一条无向边,求连通块的个数为 \(lth\),那么 \(a < a_p\) 的方案数是 \((m^n-m^{lth})/2\)。

#include <bits/stdc++.h>

using namespace std;

int ksm(int a, int b, int c)
{
  if (!b)
    return 1;
  int ans = ksm(a, b >> 1, c);
  ans = 1ll * ans * ans % c;
  if (b & 1)
    ans = 1ll * ans * a % c;
  return ans;
}

const int N = 2e5 + 10;
const int mod = 998244353;
int p[N];
vector <int> z[N];
bool vis[N];
void dfs(int u)
{
  vis[u] = true;
  for (auto &v : z[u])
    if (!vis[v])
      dfs(v);
}

signed main()
{
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i ++)
    cin >> p[i];
  for (int i = 1; i <= n; i ++)
    z[i].push_back(p[i]);
  int cnt = 0;
  for (int i = 1; i <= n; i ++)
    if (!vis[i])
    {
      cnt ++;
      dfs(i);
    }
  int p = ksm(m, n, mod) - ksm(m, cnt, mod);
  p %= mod;
  p += mod;
  p %= mod;
  p = 1ll * p * ksm(2, mod - 2, mod) % mod;
  cout << p << '\n';
  return 0;
}

标签:151,Atcoder,int,题解,vis,1ll,ans
From: https://www.cnblogs.com/BaiduFirstSearch/p/16817899.html

相关文章

  • luogu P8585 球状精灵的传说 题解
    题目大意给定\(n\)个精灵的三维幅度\(\{r_{1,i},r_{2,i},r_{3,i}\}\),任意两个精灵若在三个幅度中有两个相同(这里可以乱序)则可以将剩下的一位相加组合起来。组合过的精......
  • AtCoder Beginner Contest 274
    E-BoosterTSP问题变种,典中典。AC代码//Problem:E-Booster//Contest:AtCoder-キーエンスプログラミングコンテスト2022(AtCoderBeginner//Contest274)URL......
  • 洛谷P5020题解
    原题P5020[NOIP2018提高组]货币系统思路概述题意分析给定包含一个整数\(n\)和一个正整数集合\(a\)的货币系统\((n,a)\),要求将其化简,输出最简的货币系统中的面......
  • AtCoder Beginner Contest 263 Erasing Prime Pairs
    AtCoder传送门洛谷传送门题意有\(i\)种数,第\(i\)种数是\(a_i\),有\(b_i\)个。每次可以选择两个数\(x,y\)满足\(x+y\)为质数,将它们删除。问最多能删多少次。......
  • P4679 题解
    前言题目传送门!更好的阅读体验?大力树剖!做树剖时,大家可以膜拜@liruiduan2巨佬,他可以在考场上码200行的树剖题目。思路代码有点长。可以用这份代码对拍。/*树剖......
  • P2218 题解
    前言题目传送门!更好的阅读体验?二分答案套搜索。思路答案显然具有单调性,于是可以二分答案。问题是如何实现\(\operatorname{check}(k)\)函数(\(k\)指薄膜边长)。其......
  • 洛谷P2827题解
    原题P2827[NOIP2016提高组]蚯蚓思路概述题意分析给定整数\(n,m,q,u,v,t\)和一个数列\(\{a\}\),进行\(m\)次操作如下:每次选取其中最大数\(x\)切分为\([px],x......
  • dremio 21 版本之后反射No File System scheme matches 问题解决
    实际属于一个老问题了,整理下,方便使用,主要是我们在使用反射的时候碰到的问题问题如下UnknownFormatConversionException:Conversion='Unknownformat(pdfs)conversio......
  • CodeForces-1143#C 题解
    正文♦时间复杂度:\(\mathcal{O}(n)\)思维题,不需要建树。设数组\(a\)记录每一个节点是否尊重它的父节点,数组\(b\)记录是否有节点尊重它,特别的,叶子节点必然不被尊重。......
  • [题解]如何求连续区间最大和
    给一个数列,有正有负,如何求最大的连续区间和?需要设f数组表示每个位置为结尾的最大区间和能否让f[i]等于f[i-1]+a[i]要看这样的f[i]是否大于零如果大于0,就说明它仍然可以......