#include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#include<random>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (int)(Y);++(X))
#define reps(X,S,Y) for (int (X) = (int)(S);(X) < (int)(Y);++(X))
#define rrep(X,Y) for (int (X) = (int)(Y)-1;(X) >=0;--(X))
#define rreps(X,S,Y) for (int (X) = (int)(Y)-1;(X) >= (int)(S);--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())
#define Endl endl
#define NL <<"\n"

using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
template<class T> using vv=vector<vector<T>>;
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
//#undef NUIP
#ifdef NUIP
#include "benri.h"
#else
#define out(args...)
#endif
#ifdef __cpp_init_captures
template<typename T>vector<T> table(int n, T v){ return vector<T>(n, v);}
template <class... Args> auto table(int n, Args... args){auto val = table(args...); return vector<decltype(val)>(n, move(val));}
#endif
const ll MOD=1e9+7; //998244353

struct UF{
  vector<int> data;
  UF(int size):data(size,-1){}
  bool unite(int x,int y){
    x=root(x); y=root(y);
    if(x!=y){
      if(-data[y]>-data[x]) swap(x,y);
      data[x]+=data[y]; data[y]=x;
    }
    return x!=y;
  }
  bool findSet(int x,int y){return root(x)==root(y);}
  int root(int x){return data[x]<0?x:data[x]=root(data[x]);}
  int size(int x) {return -data[root(x)];}
	bool operator()(int x,int y){ return findSet(x,y);}
	int operator[](int x){ return root(x);}
	bool unti(int x,int y){ return unite(x,y);}
};

ll modpow_(ll r,ll n,ll m=MOD){
  ll re=1,d=r%m;
  if(n<0)(n%=m-1)+=m-1;
  for(;n;n/=2){
    if(n&1)(re*=d)%=m;
    (d*=d)%=m;
  }
  return re;
}
template <int mod=MOD> struct ModInt{
  int v;
  ModInt(int v=0):v(v){}
  ModInt operator+(const ModInt &n)const{return v+n.v<mod ? v+n.v : v+n.v-mod;}
  ModInt operator-(const ModInt &n)const{return v-n.v<0 ? v-n.v+mod : v-n.v;}
  ModInt operator*(const ModInt &n)const{return ll(v)*n.v%mod;}
  ModInt operator/(const ModInt &n)const{return ll(v)*modpow_(n.v%mod,-1,mod)%mod;}
  ModInt operator+(const ll &n)const{return v+n<mod ? v+n : v+n-mod;}
  ModInt operator-(const ll &n)const{return v-n<0 ? v-n+mod : v-n;}
  ModInt operator*(const ll &n)const{return ll(v)*(n%mod)%mod;}
  ModInt operator/(const ll &n)const{return ll(v)*modpow_(n%mod,-1,mod)%mod;}
  ModInt& operator+=(const ModInt &n){v+=n.v; if(v>=mod) v-=mod; return *this;}
  ModInt& operator-=(const ModInt &n){v-=n.v; if(v<0) v+=mod; return *this;}
  ModInt& operator*=(const ModInt &n){v=ll(v)*n.v%mod; return *this;}
  ModInt& operator/=(const ModInt &n){v=ll(v)*modpow_(n.v,-1,mod)%mod; return *this;}
  ModInt& operator+=(const ll &n){v+=n; if(v>=mod) v-=mod; return *this;}
  ModInt& operator-=(const ll &n){v-=n; if(v<0) v+=mod; return *this;}
  ModInt& operator*=(const ll &n){v=ll(v)*n%mod; return *this;}
  ModInt& operator/=(const ll &n){v=ll(v)*modpow_(n,-1,mod)%mod; return *this;}
	bool operator==(const ModInt &n)const{return v==n.v;};
	bool operator!=(const ModInt &n)const{return v!=n.v;};
	ModInt& operator++(){ return operator+=(1); }
	ModInt& operator--(){ return operator-=(1); }
	ModInt operator++(int i){ ModInt tmp(*this); operator++(); return tmp; }
	ModInt operator--(int i){ ModInt tmp(*this); operator--(); return tmp; }
};
#ifdef NUIP
class MINT_FRAC____{
public:
	unordered_map<int,pii> dict;
	MINT_FRAC____(int n){
		rep(p,n+1)reps(q,1,n+1)if(__gcd(p,q)==1){
			dict[1ll*p*modpow_(q,-1)%MOD]=pii(p,q);
			dict[MOD-1ll*p*modpow_(q,-1)%MOD]=pii(-p,q);
		}
	}
} Il1Il1Il1(1000);
template<int mod> ostream& operator<<(ostream &os,const ModInt<mod> &n){if(Il1Il1Il1.dict.count(n.v)) os<<n.v<<"("<<Il1Il1Il1.dict[n.v].X<<"/"<<Il1Il1Il1.dict[n.v].Y<<")";else os<<n.v;return os;};
#else
template<int mod> ostream& operator<<(ostream &os,const ModInt<mod> &n){return os<<n.v;};
#endif
template<int mod> ModInt<mod> operator+(const ll &n,const ModInt<mod> &m){return m.v+n<mod ? m.v+n : m.v+n-mod;}
template<int mod> ModInt<mod> operator-(const ll &n,const ModInt<mod> &m){return n-m.v<0 ? n-m.v+mod : n-m.v;}
template<int mod> ModInt<mod> operator*(const ll &n,const ModInt<mod> &m){return ll(m.v)*(n%mod)%mod;}
template<int mod> ModInt<mod> operator/(const ll &n,const ModInt<mod> &m){return ModInt<mod>(n%mod)/m;}
typedef ModInt<MOD> mint;
template <int mod> ModInt<mod> modpow(ModInt<mod> r,ll n){ ModInt<mod> re(1); if(n<0)(n%=mod-1)+=mod-1; for(;n;n/=2){if(n&1) re*=r; r*=r;} return re;}
vector<mint> fact,finv,inv;
mint comb(ll n,ll r){ if(n<r||r<0)return 0; return fact[n]*finv[n-r]*finv[r];}
class Doralion{
  void Modinvs(vector<mint> &re,int n){ re.resize(n+1); re[1]=1; for(int i=2;i<=n;++i)re[i]=re[MOD%i]*(MOD-MOD/i);}
  void Facts(vector<mint> &re,int n){ re.resize(n+1); re[0]=1; rep(i,n)re[i+1]=re[i]*(i+1);}
  void Factinvs(vector<mint> &re,const vector<mint> &inv,int n){ re.resize(n+1); re[0]=1; rep(i,n)re[i+1]=re[i]*inv[i+1];}
public:
  Doralion(int n){ Modinvs(inv,n); Facts(fact,n); Factinvs(finv,inv,n);}
} doralion(1123456);
using pmm=pair<mint,mint>;
mint modpow(ll r,ll n){ return modpow_(r,n);}

mint solve(vector<int> p){
	const int n=p.size();
	UF uf(n);
	rep(i,n)if(p[i]>=0) uf.unite(i,p[i]);
	vector<int> deg(n);
	rep(i,n)if(p[i]<0) deg[uf.root(i)]=1;
	int t=accumulate(all(deg),0);
	int cc=0;
	rep(i,n)if(uf.root(i)==i) ++cc;
	mint re=mint(n-(cc-t))*modpow(n-1,t);
	assert(cc>=t && n>=cc);
	vector<mint> dp(n+1);
	dp[0]=1;
	rep(i,n)if(deg[i]){
		int sz=uf.size(i);
		re-=modpow(n-1,t-1)*(sz-1);
		// out(i,sz,modpow(n-1,t-1)*(sz-1),1);
		rrep(j,n) dp[j+1]+=dp[j]*sz;
	}
	// out(dp,re,1);
	reps(i,t+1,n+1) assert(dp[i].v==0);
	reps(i,2,t+1){
		re-=dp[i]*fact[i-1]*modpow(n-1,t-i);
	}
	return re;
	// cout<<(re.v%MOD+MOD)%MOD NL;
}

ll bf4(vector<int> p){
	ll re=0;
	rep(i0,4)if(i0!=0 && (p[0]<0||p[0]==i0))
		rep(i1,4)if(i1!=1 && (p[1]<0||p[1]==i1))
			rep(i2,4)if(i2!=2 && (p[2]<0||p[2]==i2))
				rep(i3,4)if(i3!=3 && (p[3]<0||p[3]==i3)){
					UF uf(4);
					uf.unite(0,i0);
					uf.unite(1,i1);
					uf.unite(2,i2);
					uf.unite(3,i3);
					re+=4;
					rep(i,4)if(uf.root(i)==i) --re;
				}
	return re;
}
ll bf6(vector<int> p){
	ll re=0;
	rep(i0,6)if(i0!=0 && (p[0]<0||p[0]==i0))
		rep(i1,6)if(i1!=1 && (p[1]<0||p[1]==i1))
			rep(i2,6)if(i2!=2 && (p[2]<0||p[2]==i2))
				rep(i3,6)if(i3!=3 && (p[3]<0||p[3]==i3))
					rep(i4,6)if(i4!=4 && (p[4]<0||p[4]==i4))
						rep(i5,6)if(i5!=5 && (p[5]<0||p[5]==i5)){
					UF uf(6);
					uf.unite(0,i0);
					uf.unite(1,i1);
					uf.unite(2,i2);
					uf.unite(3,i3);
					uf.unite(4,i4);
					uf.unite(5,i5);
					re+=6;
					rep(i,6)if(uf.root(i)==i) --re;
				}
	return re;
}
	

int main(){
	if(0){
		reps(i0,-1,6)if(i0!=0)reps(i1,-1,6)if(i1!=1)reps(i2,-1,6)if(i2!=2)reps(i3,-1,6)if(i3!=3)reps(i4,-1,6)if(i4!=4)reps(i5,-1,6)if(i5!=5){
								vector<int> a{i0,i1,i2,i3,i4,i5};
								ll exp=bf6(a);
								mint act=solve(a);
								if(exp%MOD!=act.v){
									out(a,exp,act,1);
									return 0;
								}
					}
		return 0;
	}
  ios_base::sync_with_stdio(false); cin.tie(0);
  cout<<fixed<<setprecision(0);
	{
		ll re=0;
	rep(i0,4)if(i0!=0)rep(i1,4)if(i1!=1)rep(i2,4)if(i2!=2)rep(i3,4)if(i3!=3){
					UF uf(4);
					uf.unite(0,i0);
					uf.unite(1,i1);
					uf.unite(2,i2);
					uf.unite(3,i3);
					re+=4;
					rep(i,4)if(uf.root(i)==i) --re;
				}
	out(re,1);
	}
	
	int n;
	cin>>n;
	vector<int> p(n);
	for(auto &x:p){
		cin>>x;
		if(x>0) --x;
	}
	cout<<solve(p) NL;
  return 0;
}


Measured memory_bytes: 16716