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; }