Codeforces Global Round 7 C. Permutation Partitions(组合数学)

题意:

给你 n 长全排列的一种情况,将其分为 k 份,取每份中的最大值相加,输出和的最大值和有多少种分法等于最大值。

思路:

取前 k 大值,储存下标,每两个 k 大值间有 vi+1 - vi 种分法,相乘即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
int main()
{
    int n,k;cin>>n>>k;
    int p[n];for(int &i:p) cin>>i;
    ll sum=0;
    vector<int> v;
    for(int i=0;i<n;i++)
        if(p[i]>n-k){
            sum+=p[i];
            v.push_back(i);
        }
    ll ans=1;
    for(int i=0;i<int(v.size())-1;i++)
        ans=ans*(v[i+1]-v[i])%mod;
    cout<<sum<<' '<<ans<<"\n";
    return 0;
}

 

posted @ 2020-03-20 01:24  Kanoon  阅读(382)  评论(0编辑  收藏  举报