#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
struct UF{
	int n;
	vector<int>parent,rank;
	UF(int n_=0):n(n_),parent(n_),rank(n_,1)
	{
		for(int i=0;i<n_;i++)parent[i]=i;
	}
	int find(int a){return parent[a]!=a?parent[a]=find(parent[a]):a;}
	bool same(int a,int b){return find(a)==find(b);}
	bool unite(int a,int b)
	{
		a=find(a),b=find(b);
		if(a==b)return false;
		if(rank[a]<rank[b])
		{
			parent[a]=b;
			rank[b]+=rank[a];
		}
		else
		{
			parent[b]=a;
			rank[a]+=rank[b];
		}
		return true;
	}
	int size(int a){return rank[find(a)];}
};
const long mod=1e9+7;
int N;
int P[5050];
long dp[5050];
bool vis[5050];
long Nf[5050];
int main()
{
	cin>>N;
	UF uf(N);
	int out=N;
	Nf[0]=1;
	for(int i=0;i<N;i++)
	{
		Nf[i+1]=Nf[i]*(N-1)%mod;
		cin>>P[i];
		if(P[i]>0)
		{
			P[i]--;
			if(!uf.unite(i,P[i]))
			{
				out--;
				vis[i]=true;
			}
		}
	}
	dp[0]=1;
	for(int i=0;i<N;i++)if(vis[i])vis[uf.find(i)]=true;
	int K=0;
	for(int i=0;i<N;i++)if(!vis[uf.find(i)])
	{
		int sz=uf.size(i);
		vis[uf.find(i)]=true;
		for(int j=K;j>=0;j--)
		{
			(dp[j+1]+=dp[j]*sz*(j==0?1:j))%=mod;
		}
		K++;
	}
	long ans=Nf[K]*out%mod;
	for(int i=1;i<=K;i++)
	{
		(ans+=mod-Nf[K-i]*dp[i]%mod)%=mod;
	}
	(ans+=Nf[K-1]*K)%=mod;
	cout<<ans<<endl;
}
