#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <numeric>
using namespace std;
typedef long long int ll;

constexpr ll mod=1e9+7;

ll mod_pow(ll a,ll b){
    a%=mod;
    if(b==0)return 1;
    if(b==1)return a;
    ll res=mod_pow(a,b/2)%mod;
    res*=res; res%=mod;
    if(b%2)res*=a;
    return res%mod;
}

struct UnionFind{
    vector<int> par,num;
    vector<bool> done;
    UnionFind(int n):par(n),num(n,1),done(n,false){
        iota(par.begin(),par.end(),0);  //include<numeric>
    }
    int find(int v){
        return (par[v]==v)?v:(par[v]=find(par[v]));
    }
    void unite(int u,int v){
        u=find(u),v=find(v);
        if(u==v)return;
        if(num[u]<num[v])swap(u,v);
        num[u]+=num[v];
        par[v]=u;
        done[u]=done[u]|done[v];
    }
    bool same(int u,int v){
        return find(u) == find(v);
    }
    bool ispar(int v){
        return v=find(v);
    }
    int size(int v){
        return num[find(v)];
    }
};

ll dp[5050];
ll po[5050];

int main(){
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	int n; cin >> n;
    UnionFind uf(n);
    vector<int> p(n);
    for(int i=0;i<n;i++){
        cin >> p[i];
        if(p[i]>0)p[i]--;
    }
    int k=0;
    int r=0;
    for(int i=0;i<n;i++){
        if(p[i]==-1)k++;
        else{
            if(uf.same(i,p[i]))r++;
            uf.unite(i,p[i]);
        }
    }
    ll res=(ll)(n-r)*mod_pow(n-1,k)%mod;
    po[0]=1;
    for(int i=1;i<=n;i++){
        (po[i]=po[i-1]*i%mod)%=mod;
    }
    dp[0]=1;
    for(int i=0;i<n;i++){
        if(p[i]==-1){
            int pre=uf.find(i);
            int sz=uf.size(pre);
            // 同連結成分内のを引く
            (res-=1LL*(sz-1)*mod_pow(n-1,k-1)%mod)%=mod;
            if(res<0)res+=mod;
            for(int j=k;j;j--){
                (dp[j]+=dp[j-1]*sz%mod)%=mod;
            }
        }
    }
    for(int i=2;i<=k;i++){
        (res-=dp[i]*mod_pow(n-1,k-i)%mod*po[i-1]%mod)%=mod;
    }
    if(res<0)res+=mod;
    /*int sz=0;
    for(int i=0;i<n;i++){
        if(p[i]==-2){
            k++;
        }
        else{
            if(!uf.same(i,p[i])){
                uf.unite(i,p[i]);
                sz++;
            }
        }
    }
    ll po=mod_pow(n-1,k);
    ll res=po*sz%mod;
    vector<int> v(n,0);
    for(int i=0;i<n;i++){
        if(p[i]==-2)p[i]++;
        if(p[i]==-1)v[uf.find(i)]++;
    }
    vector<int> vv;
    vector<bool> Usd(n,0);
    for(int i=0;i<n;i++){
        int pppp=uf.find(i);
        if(Usd[pppp])continue;
        Usd[pppp]=1;
        if(v[pppp]==0)vv.push_back(uf.size(pppp));
    }
    for(int i=0;i<vv.size();i++){
        ll pp=vv[i]*mod_pow(n-1,mod-2)%mod;
        (pp*=po)%=mod;
        (res+=pp*k)%=mod;
    }
    sort(v.rbegin(), v.rend());
    for(int i=0;i<n;i++){
        if(v[i]==0)continue;
        vector<bool> used(n,false);
        for(int j=0;j<n;j++){
            if(uf.same(i,j))continue;
            int pre=uf.find(j);
            if(used[pre])continue;
            used[pre]=1;
            sz=uf.size(pre);
            
            if(v[pre]==0){
                used[pre]=1;
                int szsz=uf.size(pre);
                ll pp=1LL-mod_pow((n-1-szsz)*mod_pow(n-1,mod-2)%mod,v[i]);
                if(pp<0)pp+=mod;
                (pp*=po)%=mod;
                (res+=pp)%=mod;
            }
            else{
                used[pre]=1;
                if(pre<i){
                    int szsz=uf.size(i);
                    ll pp=mod_pow((n-1-szsz)*mod_pow(n-1,mod-2)%mod,v[pre]);
                    if(pp<0)pp+=mod;
                    szsz=uf.size(pre);
                    ll qq=1LL-mod_pow((n-1-szsz)*mod_pow(n-1,mod-2)%mod,v[i]);
                    if(qq<0)qq+=mod;
                    (pp*=qq)%=mod;
                    (pp*=po)%=mod;
                    (res+=pp)%=mod;
                }
                else{
                    int szsz=uf.size(pre);
                    ll pp=1LL-mod_pow((n-1-szsz)*mod_pow(n-1,mod-2)%mod,v[i]);
                    if(pp<0)pp+=mod;
                    pp*=po;
                    (res+=pp)%=mod;
                }
            }
        }
    }*/
    printf("%lld\n",res);
}

Measured memory_bytes: 3852