康拓展开

news/2025/10/24 12:56:49/文章来源:https://www.cnblogs.com/xihegudi/p/19162975

康拓展开

正向展开普通解法

将一个字典序排列转换成序号。例如:12345->1,12354->2。

int f[20];
void jie_cheng(int n) { // 打出1-n的阶乘表f[0] = f[1] = 1; // 0的阶乘为1for (int i = 2; i <= n; i++) f[i] = f[i - 1] * i;
}
string str;
int kangtuo() {int ans = 1; // 注意,因为 12345 是算作0开始计算的,最后结果要把12345看作是第一个int len = str.length();for (int i = 0; i < len; i++) {int tmp = 0; // 用来计数的// 计算str[i]是第几大的数,或者说计算有几个比他小的数for (int j = i + 1; j < len; j++)if (str[i] > str[j]) tmp++;ans += tmp * f[len - i - 1];}return ans;
}
int main() {jie_cheng(10);string str = "52413";cout << kangtuo() << endl;
}

正向展开树状数组解

给定一个全排列,求出它是 1 ~ \(n\) 所有全排列的第几个,答案对 \(998244353\) 取模。

答案就是 \(\sum_{i = 1}^{n} res_{a_i} (n - i)!\)\(res_x\) 表示剩下的比 \(x\) 小的数字的数量,通过树状数组处理。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 998244353, N = 1e6 + 10;
LL fact[N];
struct fwt{LL n;vector <LL> a;fwt(LL n) : n(n), a(n + 1) {}LL sum(LL x){LL res = 0;for (; x; x -= x & -x)res += a[x];return res;}void add(LL x, LL k){for (; x <= n; x += x & -x)a[x] += k;}LL query(LL x, LL y){return sum(y) - sum(x - 1);}
};
int main(){ios::sync_with_stdio(false);cin.tie(0);LL n;cin >> n;fwt a(n);fact[0] = 1;for (int i = 1; i <= n; i ++ ){fact[i] = fact[i - 1] * i % mod;a.add(i, 1);}LL ans = 0;for (int i = 1; i <= n; i ++ ){LL x;cin >> x;ans = (ans + a.query(1, x - 1) * fact[n - i] % mod ) % mod;a.add(x, -1);}cout << (ans + 1) % mod << "\n";return 0;
}

逆向还原

string str;
int kangtuo(){int ans = 1;  //注意,因为 12345 是算作0开始计算的,最后结果要把12345看作是第一个int len = str.length();for(int i = 0; i < len; i++){int tmp = 0;//用来计数的for(int j = i + 1; j < len; j++){if(str[i] > str[j]) tmp++;//计算str[i]是第几大的数,或者说计算有几个比他小的数}ans += tmp * f[len - i - 1];}return ans;
}
int main(){jie_cheng(10);string str = "52413";cout<<kangtuo()<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求解连续数字的正约数集合——倍数法

求解连续数字的正约数集合——倍数法 使用规律递推优化,时间复杂度为 \(\mathcal{O}(N\log N)\) ,如果不需要详细的输出集合,则直接将 vector 换为普通数组即可(时间更快) 。 #include <bits/stdc++.h> usi…

git回滚代码

回滚上一次提交是指撤销最近一次的git提交操作。在实际使用中,有两种常见的方法可以实现这个操作: 方法一:使用git revert命令回滚 1. 首先,通过命令`git log`查看提交记录,找到要回滚的提交的hash值。 2. 使用命…

Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解

Apache POI 在 Linux 无图形界面环境下因字体配置问题导致Excel导出失败的解决方案 - 详解2025-10-24 12:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !importan…

扩展欧几里得 exgcd

扩展欧几里得 exgcd 求解形如 \(a\cdot x + b\cdot y = \gcd(a,b)\) 的不定方程的任意一组解。 int exgcd(int a, int b, int &x, int &y) {if (!b) {x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);y…

离散对数 bsgs 与 exbsgs

离散对数 bsgs 与 exbsgs 以 \(\mathcal O(\sqrt {P})\) 的复杂度求解 \(a^x \equiv b(\bmod P)\) 。其中标准 \(\tt BSGS\) 算法不能计算 \(a\) 与 \(MOD\) 互质的情况,而 exbsgs 则可以。 namespace BSGS { LL a, …

防爆模乘

防爆模乘 借助浮点数实现 以 \(\mathcal O(1)\) 计算 \(a\cdot b\bmod p\) ,由于不取模,常数比 int128 法小很多。其中 \(1 \le n, k, p \le 10^{18}\) 。 int mul(int a, int b, int m) {int r = a * b - m * (int)…

欧拉筛(线性筛)

欧拉筛(线性筛) 时间复杂度为 \(\mathcal{O}(N\log\log N)\) 。 vector<int> prime; // 这里储存筛出来的全部质数 auto euler_Prime = [&](int n) -> void {vector<int> v(n + 1);for (int i = …

常见数列

常见数列 调和级数 满足调和级数 \(\mathcal O\left( \dfrac{N}{1} +\dfrac{N}{2}+\dfrac{N}{3}+\dots + \dfrac{N}{N} \right)\),可以用 $ \approx N\ln N$ 来拟合,但是会略小,误差量级在 \(10\%\) 左右。本地可以…

20232314 2025-2026-1 《网络与系统攻防技术》实验三实验报告

一.实验内容(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧。正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 (2)通过组合应用各种技术…

【LTDC】LTDC 简介

前言 此篇文章仅作笔记分享,内容来源为:【正点原子】全是干货 | 手把手教你学STM32的LTDC这一节课目的就是了解一下 LTDC 的各种特点,方便后面学习。 LTDC 简介控制器框图信号线 注意不同芯片会有不同的引脚对应。 …

Markdown数学公式 - -一叶知秋

1.1 公式表达显示 代码行内公式 $数学公式$独立公式 $$数学公式$$1.2 上下标显示 代码$x^2$ $x^2$$x_2$ $x_2$1.3 括号显示 代码$\underbrace{yyyy}_{ \text{xxx} }$ $\underbrace{yyyy}_{ \text{xxxx} }$$\begin{case…

分类器案例 - -一叶知秋

模型复杂程度 一、常见衡量指标参数数量(Number of Parameters)模型包含的可学习参数越多,复杂度越高。 例如:线性回归:参数个数 = 特征维数 + 1 深度神经网络:每层权重矩阵大小 层数例子:ResNet-18(约1100万…

最大流

最大流 Dinic 解 使用 \(\tt Dinic\) 算法,理论最坏复杂度为 \(\mathcal O(N^2M)\) ,例题范围:\(N=1200,\ m=5\times 10^3\) 。一般步骤:\(\tt BFS\) 建立分层图,无回溯 \(\tt DFS\) 寻找所有可行的增广路径。封装…

最小割树 Gomory-Hu Tree

最小割树 Gomory-Hu Tree 无向连通图抽象出的一棵树,满足任意两点间的距离是他们的最小割。一共需要跑 \(n\) 轮最小割,总复杂度 \(\mathcal O(N^3M)\) ,预处理最小割树上任意两点的距离 \(\mathcal O(N^2)\) 。 过…

最小割

最小割 基础模型:构筑二分图,左半部 \(n\) 个点代表盈利项目,右半部 \(m\) 个点代表材料成本,收益为盈利之和减去成本之和,求最大收益。 建图:建立源点 \(S\) 向左半部连边,建立汇点 \(T\) 向右半部连边,如果某…

费用流

费用流 给定一个带费用的网络,规定 \((u,v)\) 间的费用为 \(f(u,v) \times w(u,v)\) ,求解该网络中总花费最小的最大流称之为最小费用最大流。总时间复杂度为 \(\mathcal O(NMf)\) ,其中 \(f\) 代表最大流。 struct…

图论常见结论及例题

图论常见结论及例题 常见结论要在有向图上求一个最大点集,使得任意两个点 \((i,j)\) 之间至少存在一条路径(可以是从 \(i\) 到 \(j\) ,也可以反过来,这两种有一个就行),即求解最长路;要求出连通图上的任意一棵生…

查询GPIO状态值(步骤)

查询GPIO状态值(步骤)1.导出GPIO(如果还没有被导出): echo 31 > /sys/class/gpio/export 2.查询是否导出成功 ls -lh /sys/class/gpio/gpio31 如果出现gpio31文件夹,说明gpio导出成功。开机时导出一次即可 3.查…

最长路(topsort+DP算法)

最长路(topsort+DP算法) 计算一张 \(\tt DAG\) 中的最长路径,在执行前可能需要使用 \(\tt tarjan\) 重构一张正确的 \(\tt DAG\) ,复杂度 \(\mathcal O(N+M)\) 。 struct DAG {int n;vector<vector<pair<…

最短路径树(SPT问题)

最短路径树(SPT问题)定义:在一张无向带权联通图中,有这样一棵生成树:满足从根节点到任意点的路径都为原图中根到任意点的最短路径。 性质:记根节点 \(Root\) 到某一结点 \(x\) 的最短距离 \(dis_{Root,x}\) ,在…