当前位置:网站首页>#775 Div.1 C. Tyler and Strings 组合数学
#775 Div.1 C. Tyler and Strings 组合数学
2022-07-05 04:43:00 【Strezia】
C
组合数学,1900,数状数组
题意
给出 s , t s, t s,t 两个序列,长度分别为 n , m n,m n,m,问 s s s 有多少种排序方式满足 s s s 的字典序比 t t t 小。 1 ≤ n , m ≤ 2 e 5 1\leq n,m\leq 2e5 1≤n,m≤2e5
思路
因为是按字典序比较,所以如果 s 1 < t 1 s_1<t_1 s1<t1 之后的就可以随便排了,所以考虑枚举前 i − 1 i-1 i−1 位相同且 s i < t i s_i<t_i si<ti 的排序方式有 c n t i cnt_i cnti 种,最后的答案就是 ∑ i = 1 i = n c n t i \sum_{i=1}^{i=n} cnt_i ∑i=1i=ncnti 。
那么如何求 c n t i cnt_i cnti 呢?如果不考虑可重复排列,那么 c n t i = n o w × ( n − i ) ! cnt_i= now \times (n-i)! cnti=now×(n−i)! ,即到第 i 位当前满足小于 t i t_i ti 的个数乘上之后数的全排列(因为 i i i 后面的数可以随便取了)。 n o w now now 可以直接用数状数组维护前缀和(因为前 i − 1 i-1 i−1 位两序列相同,所以可以直接将那个数字数量减1)。于是问题重点在于加上可重复排列后怎么做。
首先可重复排列要在 n ! n! n! 的基础上除以每个元素出现数量的阶乘。即当我们遍历到第 i i i 位时,要在 ( n − i ) ! (n-i)! (n−i)! 的基础上除以 c n t 1 ! × c n t 2 ! × c n t i ! . . . . × c n t n ! {cnt_1!\times cnt_2!\times cnt_i!....\times cnt_n!} cnt1!×cnt2!×cnti!....×cntn!
其中 c n t 1 cnt_1 cnt1 是减去前 i − 1 i-1 i−1 位数字后的对应数字的数量。然后我们就可以先预处理出 i = 0 i=0 i=0 时的上式记为 fenzi,由
1 c n t 1 ! × c n t 2 ! × ( c n t i − 1 ) ! . . . . × c n t n ! = 1 c n t 1 ! × c n t 2 ! × c n t i ! . . . . × c n t n ! × c n t i \frac{1}{cnt_1!\times cnt_2!\times (cnt_i-1)!....\times cnt_n!}=\frac{1}{cnt_1!\times cnt_2!\times cnt_i!....\times cnt_n!}\times cnt_i cnt1!×cnt2!×(cnti−1)!....×cntn!1=cnt1!×cnt2!×cnti!....×cntn!1×cnti,只需每次遍历后将 fenzi *= cnt[t[i]] 并更新 cnt[t[i]] 即可。
ps.不要忘记考虑 s s s 可能恰好为 t t t 的前缀的情况,开始忘了,还好有样例1
代码
void solve() {
cin >> n >> m;
fac[0] = 1;
for(int i = 1; i <= n; i++) {
fac[i] = (fac[i-1] * i) % P;
}
for(int i = 1; i <= n; i++) {
cin >> s[i];
update(s[i], 1);
cnt[s[i]]++;
}
for(int i = 1; i <= m; i++) {
cin >> t[i];
}
int ans = 0;
int mi = min(n, m);
int fz = 1;
for(int i = 1; i <= 2e5; i++) {
if(cnt[i]) {
fz = fz * fac[cnt[i]] % P;
}
}
fz = power(fz, P - 2);
int flag = 1;
if(n >= m) {
flag = 0;
}
for(int i = 1; i <= mi; i++) {
int p = ask(t[i] - 1);
ans = (ans + p * fac[n-i] % P * fz % P) % P;
if(!cnt[t[i]]) {
flag = 0;
break;
}
fz = fz * cnt[t[i]] % P;
cnt[t[i]]--;
update(t[i], -1);
}
ans += flag;
ans %= P;
cout << ans << endl;
}
边栏推荐
- Observable time series data downsampling practice in Prometheus
- Flutter 小技巧之 ListView 和 PageView 的各种花式嵌套
- Data security -- 14 -- Analysis of privacy protection governance
- Decryption function calculates "task state and lifecycle management" of asynchronous task capability
- How should programmers learn mathematics
- 取余操作是一个哈希函数
- [crampon programming] lintcode decoding Encyclopedia - 1100 strange printer
- Group counting notes (1) - check code, original complement multiplication and division calculation, floating point calculation
- English topic assignment (27)
- Solutions and answers for the 2021 Shenzhen cup
猜你喜欢

Manually implement heap sorting -838 Heap sort

Group counting notes (1) - check code, original complement multiplication and division calculation, floating point calculation

线上故障突突突?如何紧急诊断、排查与恢复

2021 Higher Education Club Cup mathematical modeling national tournament ABCD problem - problem solving ideas

Sequence diagram of single sign on Certification Center

File upload bypass summary (upload labs 21 customs clearance tutorial attached)

次小生成树

OWASP top 10 vulnerability Guide (2021)

【acwing】528. cheese

Construction d'un Cluster redis sous Windows
随机推荐
A survey of automatic speech recognition (ASR) research
程序员应该怎么学数学
取余操作是一个哈希函数
包 类 包的作用域
Hypothesis testing -- learning notes of Chapter 8 of probability theory and mathematical statistics
CSDN正文自动生成目录
Advanced length of redis -- deletion strategy, master-slave replication, sentinel mode
【acwing】836. Merge sets
Function overloading
The 22nd Spring Festival Gala, an immersive stage for the yuan universe to shine into reality
Official announcement! The third cloud native programming challenge is officially launched!
Manually implement heap sorting -838 Heap sort
Cookie learning diary 1
Fluent objects and lists
Sword finger offer 07 Rebuild binary tree
[uniapp] system hot update implementation ideas
CSDN body auto generate directory
MySQL in-depth learning - index creation and deletion, index design principles, index failure scenarios, query optimization, index push down ICP
The remainder operation is a hash function
2021 huashubei mathematical modeling idea + reference + paper