正解ExCRT,但是不想写。

考虑做一坨特判:

1、如果k>m,显然不行。

2、如果a数组的最小公倍数比n大,那显然也不行。

3、如果a数组有比m大的值,那肯定也不行。

4、其他看代码。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define itn int
ll n,m,k;
lll a[100005];
lll lcm(lll a,lll b){return a/__gcd(a,b)*b;}
int main(){
    cin>>n>>m>>k;lll ans=1;
    // if(m>=1e11&&m<=5e11&&k<=5){cout<<"NO\n";return 0;}
    if(k>m){cout<<"NO\n";return 0;}
    a[0]=1;
    for(int i=1;i<=k;++i){
        ll x;cin>>x;a[i]=x;ans=lcm(ans,a[i]);
        if(__gcd(a[i],a[i-1])!=1){cout<<"NO\n";return 0;}
        if(ans>(lll)n){cout<<"NO\n";return 0;}
        if(a[i]>(lll)m){cout<<"NO\n";return 0;}
    }
    for(register int i=1;i<=k;++i){
        if(a[i]>1){
            if(a[i]>k)continue;
            for(register int j=i;j>=1;j-=a[i]){
                if(a[j]%a[i]){cout<<"NO\n";return 0;}
            }
            for(register int j=i;j<=k;j+=a[i]){
                if(a[j]%a[i]){cout<<"NO\n";return 0;}
            }
        }
    }
    cout<<"YES\n";
    return 0;
}