题意:给你n个数和m,问你这个n个数的阶乘之和能不能被m!(阶乘)整除。
思路:乍一看这个题目完全没有思路,但是在发现(m+1)!=m!*(m+1)之后,可以发现m+1的阶乘可以由m+1个m的阶乘组成,然后我们可以将所有给的数组合起来,如果能够形成比它大的阶乘,如果能形成就往上合并,如果不能就判断不能被整除,当合并到m时,因为如果合并到了m的阶乘,无论是不是往上合并都是可以被整除的,所以就不需要走到m。
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
ll s[N];
int main()
{
cin>>n>>m;
for(int i =1;i<=n;i++)
{
int x;
cin>>x;
s[x]++;
}
int flag=0;
for(int i =1;i<m;i++)
{
if(s[i]%(i+1)!=0){
flag=1;
break;
}
s[i+1]+=s[i]/(i+1);
}
if(flag)cout<<"NO\n";
else cout<<"YES\n";
return 0;
}