#include typedef int64_t i64; typedef long double f128; using namespace std; template void scan(T& n) { cin>>n; return; } void scan() { return; } template void scan(T& n,Args&... args) { scan(n); scan(args...); return; } template void scan_array(T start,T end) { T now=start; for(;now!=end;++now) { scan(*now); } return; } template void print(T n) { cout< void println(T n) { print(n); print('\n'); return; } template void println(T n,Args... args) { print(n); print(' '); println(args...); return; } template void print_array(T start,T end) { T now=start; print(*now); ++now; for(;now!=end;++now) { print(' '); print(*now); } print('\n'); return; } i64 pow_mod(i64 a,i64 n,i64 mod) { i64 res=1,now=a; while(n) { if(n&1) { res=res*now%mod; } now=now*now%mod; n>>=1; } return res; } i64 inv_mod(i64 a,i64 mod) { return pow_mod(a,mod-2,mod); } i64 power(i64 a,i64 n) { i64 res=1; for(i64 i=0;i div_enum(i64 n) { vector res; for(i64 i=1;i*i<=n;++i) { if(n%i==0) { res.push_back(i); if(i*i!=n) { res.push_back(n/i); } } } sort(res.begin(),res.end()); return res; } struct combination { vector fact,inv,fact_inv; i64 mod=-1; combination(int Max,const i64 mod_):fact(Max+1,1),inv(Max+1,1),fact_inv(Max+1,1) { mod=mod_; for(i64 i=2;i<=Max;++i) { fact[i]=fact[i-1]*i%mod; inv[i]=mod-(mod/i*inv[mod%i]%mod); fact_inv[i]=fact_inv[i-1]*inv[i]%mod; } } i64 nCk(i64 n,i64 k) { if(n>h) { if(h==0) { is_corner=1; } M-=h+1; cnt+=1; } if(cnt==1&&is_corner) { println(1); return 0; } if(M<0) { println("NA"); return 0; } println(COM.nCk(M+cnt,M)); return 0; }