最开始我看这道题很懵。看了题解才能领悟这个思路。这又双叒刷新了我对数学的认知,数学真的是博大精深。该题简单来讲就是判断给出一堆数的阶乘和能否被k的阶乘整除。那么其实我们不需要枚举的是大于等于k的数,因为这个数一定可以被k的阶乘整除。那么我们要枚举的应该是1到k-1的数。用map记录一下每一个数出现的次数(这里用hh来代替),hh[i]看是否可以整除i+1,如果不能,那就可以直接跳出输出no,如果可以则hh[i+1]+=hh[i]/(i+1)。这里用的是叠加。例如5个4的话,那该数就是4的倍数。
代码如下:
#include<stdio.h>
#include<iostream>
#include<map>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
int hh[500005];
int main(){
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
int a;
cin>>a;
hh[a]++;
}
bool f=0;
for(int i=1;i<k;i++){
if(hh[i]==0)continue;
if(hh[i]%(i+1)!=0){
f=1;
break;
}
hh[i+1]+=hh[i]/(i+1);
}
if(f==1)cout<<"No\n";
else{
cout<<"Yes\n";
}
}