[ HZOI 2015]標識DAGカウントIII
我々はすでに知っている\(のf_i \)は必ずしもユニコム必要はありません表現\(私は\)合併を検討し、DAGノードプログラムを
参照[説明] P4841都市計画(指数生成機能+多項式LN) 、その後応答\(H_I \)を生成関数\(H(X)\)溶液がそう
ための
\ [H(X)= \
sum_ {i = 0} ^ {\ INF} \のdfrac {(F(X))^ I} {I!} \] です
\ [H(X)= E ^ {F (X)} \]
ボール\(\ LN \)が IVである、それはできないダイレクトマニュアルアナログのための\(F(x)は^ I / I!\)
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=5e3+5;
const int mod=10007;
int c[maxn][maxn];
int dp[maxn];
int f[maxn];
int bin[maxn*maxn];
int main(){
freopen("DAGIII.in","r",stdin);
freopen("DAGIII.out","w",stdout);
int n=qr();
bin[0]=1;dp[0]=1;
for(register int t=0;t<=n;++t){
c[t][0]=1;
for(register int i=1;i<=t;++i){
c[t][i]=(c[t-1][i-1]+c[t-1][i])%mod;
}
}
for(register int t=1;t<=n*n;++t) bin[t]=(bin[t-1]<<1)%mod;
for(register int t=1;t<=n;++t){
for(register int i=1,d;i<=t;++i){
d=mod-c[t][i]*bin[i*(t-i)]%mod*dp[t-i]%mod;
if(i&1) d=mod-d;
dp[t]=(dp[t]+d)%mod;
}
}
for(register int t=1;t<=n;++t){
int d=0;
for(register int i=1;i<=t;++i)
d=(d+c[t-1][i-1]*f[i]%mod*dp[t-i]%mod)%mod;
f[t]=(dp[t]-d+mod)%mod;
}
printf("%d\n",f[n]);
return 0;
}