题意:求给出的n个数的阶乘之和是否能被m的阶乘整除
思路:记录下没一个小于m的数的个数,因为大于m的数的阶乘肯定能被m整除。如果这个数n出现了n+1次,这n+1个n的作用相当于n+1,就变到n+1上,从1枚举到m-1,如果枚举完m-1个数的次数为零了,就能被整除,否则不行。
#include<iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int a[500005];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
int k;
cin>>k;
if(k<m){
a[k]++;
}
}
for(int i=1;i<m;i++){
if(a[i]){
a[i+1]+=a[i]/(i+1);
a[i]=a[i]%(i+1);
}
}
sort(a+1,a+m);
if(a[m-1]!=0){
cout<<"No\n";
}
else cout<<"Yes\n";
return 0;
}