#include #include #include using namespace std; typedef long long ll; const ll mn=302; const ll MOD=1000000007ll; inline ll mul(ll x,ll y) {return (x*y)%MOD;} inline ll add(ll x,ll y) {return (x+y+MOD+MOD)%MOD;} ll a[mn]; ll f[2][mn][2][mn][2]; ll _factorial[mn]; ll factorial(ll x) { if (x<0) return 1; else return _factorial[x]; } int main() { _factorial[0]=1; for (ll i=1;i0) { // Take something < x val=mul(val,alx); alx--; ilx++; good=true; } else if (t==1&&aeqx>0) { val=mul(val,aeqx); aeqx--; ieqx++; good=true; } else if (t==2&&agx>0) { val=mul(val,agx); agx--; good=true; //igx++; Who cares? } if (!good) continue; } else if (t!=0) continue; //printf("Inter: %lld %lld %lld %lld. t:%lld\n",alx,aeqx,ilx,ieqx,t); if (p>=k-1) { if (ilx>0) ilx--; else if (ieqx>0) { ieqx--; // Add to final ll plus=mul(val,n+k-1-p); plus=mul(plus,factorial(n-p-1)); //printf("val:%lld plus:%lld. %lld %lld.\n",val,plus,n+k-1-p,factorial(n-p-1)); final=add(final,plus); } // else if (igx>0) igx--; Who cares? } f[nxt][alx][aeqx][ilx][ieqx]=add(f[nxt][alx][aeqx][ilx][ieqx],val); //printf("Add %lld to %lld %lld %lld %lld. t:%lld\n",val,alx,aeqx,ilx,ieqx,t); } } } } } } printf("%lld\n",final); }