CF-Global Round 7-C题
C. Permutation Partitions
这道题是个模拟数学题把~
这道题。。我真理解了很久emmm…我实在是不知道。。要输出的第二个数是怎么得到的。。不知道要求什么emmm。。
我看了半年。我服了。
题目大意:给你一个序列。分成k份。这里理解错了。。别把我气死。。。我一直以为是分成k个区间!!!(懂我的暴躁嘛。。。英语不好热的货。什么谷歌翻译啥的全都用上了。。我还是不懂样例输出为啥是那个答案。。)
所以我先开始就当作分成k个区间做了。前k-1个区间的个数都是1.然后把其余的全都加起来。。。后来测样例。。发现不对。。。现在想起来。。有点傻啊。。
题目的意思是:分成k份。就是拿隔板分成一份份的。。取每个区间的最大值。加起来。输出第一个参数。
第二个参数的意思就是可以有多少种分法让每个区间的最大值加起来等于第一个参数。
第一个参数就是把前k大的值加起来 。
我们把前k大的位置记录。
相当于插板子。看看相邻的数字之间间隔多少。我们这此操作的位置就可以有多少种放板子的方案数。每个相邻的数字之间放板子都是独立进行的嘛。所以直接乘起来就可以啦。
记得是ll类型噢。然后求模啦~
我又在ll那里wa了。。
代码部分:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod = 998244353;
int main()
{
int n, k;
ll ans = 0;
ll res = 1;
int flag = 0;
int x;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
int temp;
cin >> temp;
if (temp >= n - k + 1)
{
ans += temp;
if (flag)
{
res = 1ll * (res * (i - x)) % mod;
x = i;
}
else
{
flag = 1;
x = i;
}
}
}
cout << ans << " " << res << endl;
return 0;
}