CF1754D
题目
还是比较简单的。根据 \(i!\times (i+1)=(i+1)!\),所以可以对于从 \(1\sim x-1\) 的所有数进行判断,记 \(cnt[i]\) 表示 \(i!\) 的数量。如果 \(cnt[i]\mod (i+1)\) 不是 \(0\),那么肯定是无解的了,否则需要将 \(cnt[i]\div(i+1)\) 进位到 \(cnt[i+1]\)。
#include<cstdio>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define L(i,l) for(int i=0;i<l;++i)
const int N=500010;
int n,x,cnt[N];
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
scanf("%d%d",&n,&x);
L(i, n){
int x;
scanf("%d",&x);
++cnt[x];
}
Ls(i, 1, x){
if(cnt[i]%(i+1))return puts("No"),0;
else cnt[i+1]+=cnt[i]/(i+1);
}
puts("Yes");
return 0;
}