当前位置:网站首页>#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;
}
边栏推荐
- Wan broadband access technology V EPON Technology
- Function (basic: parameter, return value)
- Setting up redis cluster cluster under Windows
- Sword finger offer 07 Rebuild binary tree
- Neural networks and deep learning Chapter 2: machine learning overview reading questions
- How can CIOs use business analysis to build business value?
- C26451: arithmetic overflow: use the operator * on a 4-byte value, and then convert the result to an 8-byte value. To avoid overflow, cast the value to wide type before calling the operator * (io.2)
- [crampon programming] lintcode decoding Encyclopedia - 1100 strange printer
- 2022-2028 global and Chinese FPGA prototype system Market Research Report
- Scope of package class package
猜你喜欢
[groovy] closure closure (customize closure parameters | customize a single closure parameter | customize multiple closure parameters | specify the default value of closure parameters)
Matplotlib draws three-dimensional scatter and surface graphs
直播预告 | 容器服务 ACK 弹性预测最佳实践
[groovy] closure (closure parameter binding | curry function | rcurry function | ncurry function | code example)
首席信息官如何利用业务分析构建业务价值?
Private collection project practice sharing [Yugong series] February 2022 U3D full stack class 006 unity toolbar
2021 Higher Education Club Cup mathematical modeling national tournament ABCD problem - problem solving ideas
防护电路中的元器件
Special information | finance, accounting, audit - 22.1.23
[crampon game] MC tutorial - first day of survival
随机推荐
Reading and visualization of DICOM, MHD and raw files in medical imaging
Neural network and deep learning Chapter 1: introduction reading questions
Construction d'un Cluster redis sous Windows
History of web page requests
Function (error prone)
2021 electrician Cup - high speed rail traction power supply system operation data analysis and equivalent modeling ideas + code
函數(易錯)
The remainder operation is a hash function
程序员应该怎么学数学
Neural networks and deep learning Chapter 5: convolutional neural networks reading questions
Decimal to hexadecimal
Minor spanning tree
Stage experience
Debug insights
Moco is not suitable for target detection? MsrA proposes object level comparative learning target detection pre training method SOCO! Performance SOTA! (NeurIPS 2021)...
JMeter -- distributed pressure measurement
[groovy] closure (closure parameter list rule | default parameter list | do not receive parameters | receive custom parameters)
Practice | mobile end practice
Setting up redis cluster cluster under Windows
Components in protective circuit