CF1754D

发布时间 2023-05-27 10:44:22作者: wscqwq

题目

还是比较简单的。根据 \(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;
}