题解:P11681 [Algo Beat Contest 001 C] Creating a Queue
belif__kibo · · 题解
于2025/2/5进行修正,望审核大大通过~~~
一道带点思维量的数学题
题意梗概:给定一个长为
乍一看这个限制很吓人,实则非常简单,可以将其翻译为序列中不存在相同的数,证明如下:
1、对于任意长为二的连续子段,容易知道“不存在唯一众数”与“不存在相同数字”等效。
2、对于任意长为三的连续子段,此处不妨设三个数从左到右分别为
举例:对于
3、使用数学归纳法容易证明,若一个方案满足限制,则这个方案所得序列中不存在相同的数。
然后这题基本就做完了,只需要再注意一些细节即可:
1、数据中
2、使用 map
或 set 记录数是否已经出现,当序列中已经存在重复的数时,方案数为
3、记序列中
考虑到
考虑先从
此时,根据乘法原理,方案数应当为取走的每个数的可能种类数的积,遂有下述做法。
代码很短,码风很丑QwQ
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1145141923;
int n,m,a,b,ans=1;
unordered_map<int,int> f;
signed main()
{
cin>>n>>m;
if(m<n) return cout<<0,0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(!x) a++;
else if(f[x]) return cout<<0,0;
else f[x]=1;
}
b=m-f.size();
while(a)
{
ans=ans*b%mod;
a--;b--;
}
cout<<ans;
}