前缀和必须是平方数,所以其实就是从 里按顺序挑 个,当作每一步前缀和,能挑多少种就是答案。

void solve(){
    int n,x;cin>>n>>x;
    int m=(int)sqrt((double)x);
    while((ll)(m+1)*(m+1)<=x)++m;
    while((ll)m*m>x)--m;
    if(m<n){
        cout<<0<<endl;
        return;
    }
    vll f(m+1);
    f[0]=1;
    for(int i=1;i<=m;++i){
        f[i]=f[i-1]*i%MOD;
    }
    vll inv(m+1);
    inv[m]=qpow(f[m],MOD-2);
    for(int i=m;i>0;--i){
        inv[i-1]=inv[i]*i%MOD;
    }
    ll ans=f[m]*inv[n]%MOD*inv[m-n]%MOD;
    cout<<ans<<endl;
}