#include<bits/stdc++.h>
#define LL long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
using namespace std;
inline int read(){
	int v=0,f=1;
	char c=getchar();
	while (c<'0' || c>'9'){
		if (c=='-') f=-1;
		c=getchar();
	}
	while (c>='0' && c<='9'){
		v=v*10+c-'0';
		c=getchar();
	}
	return v*f;
}
const int Maxn=5005;
const int mod =1e9+7;
int n,p[Maxn];
int par[Maxn],cy[Maxn],sz[Maxn];
int pw[Maxn];
int findset(int x){
	return par[x]=(par[x]==x)?x:findset(par[x]);
} 
void Union(int x,int y){
	x=findset(x);y=findset(y);
	if (x==y){
		cy[x]=1;
		return;
	}
	par[x]=y;
	sz[y]+=sz[x];
	if (cy[x]) cy[y]=1;
}
void Add(int &x,int y){
	x+=y;
	if (x>=mod) x-=mod;
}
int dp[Maxn],fact[Maxn];
int main(){
	scanf("%d",&n);
	pw[0]=1;
	for (int i=1;i<=n;i++){
		pw[i]=1ll*pw[i-1]*(n-1)%mod;
	}
	fact[0]=1;
	for (int i=1;i<Maxn;i++){
		fact[i]=1ll*fact[i-1]*i%mod;
	}
	int k=0;
	for (int i=1;i<=n;i++) scanf("%d",&p[i]),k+=(p[i]==-1);
	for (int i=1;i<=n;i++) par[i]=i,sz[i]=1;
	for (int i=1;i<=n;i++){
		if (p[i]!=-1){
			Union(i,p[i]);
		}
	}
	vector<int> T;
	int ans=0;
	for (int i=1;i<=n;i++){
		if (findset(i)==i){
			if (cy[i]) {
				Add(ans,pw[k]);
			}
			else{
				T.pb(sz[i]);
			}
		}
	}
//	cout<<ans<<endl;
	dp[0]=1;
	for (int i=0;i<T.size();i++){
		for (int j=k;j>=1;j--){
			Add(dp[j],1ll*dp[j-1]*T[i]%mod);
		}
	}
	for (int i=2;i<=k;i++){
		int pre=1ll*fact[i-1]*pw[k-i]%mod;
		Add(ans,1ll*pre*dp[i]%mod);
	}
	for (int i=0;i<T.size();i++){
		int v=T[i];
		Add(ans,1ll*(v-1)*pw[k-1]%mod);
	}
//	cout<<ans<<endl;
	int res=1ll*n*pw[k]%mod;
	ans=res-ans;
	if (ans<0) ans+=mod;
	printf("%d\n",ans);
	return 0;
}