码迷,mamicode.com
首页 > 其他好文 > 详细

Hello 2020 C. New Year and Permutation

时间:2020-03-02 22:29:44      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:i+1   mes   max   排列   pre   space   name   out   序列   

Link
题意:
对于一个有 \(n\) 个不重复数的序列的排列中有多少个区间使 \(max\{ pl,pl+1,…,pr\}?min\{ pl,pl+1,…,pr\}=r?l\)
思路:
假设 \([l,r]\) 满足上述等式,设 \(len=r-l+1\),对于此区间,其所有排列均满足上述等式,即有 \(len!\) 种排列
将此区间看成一个数放入原序列,则原序列中有 \(n-len+1\) 个数,有 \((n-len+1)!\) 种排列
而对于区间长度 \(len\) 满足 \(max\{ pl,pl+1,…,pr\}?min\{ pl,pl+1,…,pr\}=r?l\) 的共有 \(n-len+1\) 种情况
所以对于区间长度 \(len\) 共有 \((n-len+1)\times{len!}\times{(n-len+1)!}\)\(O(n)\) 即可算出结果
代码:

#include<bits/stdc++.h>
 
using namespace std;
  
typedef long long ll;
 
const int N=250005;
 
int n,m;
ll fac[N];
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    fac[1]=1;
    for(int i=2;i<=n;i++) fac[i]=fac[i-1]*i%m;
    ll ans=0;
    for(int i=1;i<=n;i++) ans=(ans+fac[i]*fac[n-i+1]%m*(n-i+1)%m)%m;
    cout<<ans<<endl; 
    return 0;
}

Hello 2020 C. New Year and Permutation

标签:i+1   mes   max   排列   pre   space   name   out   序列   

原文地址:https://www.cnblogs.com/c4Lnn/p/12398389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!