// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <chrono>
#include <random>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <iomanip>
#define dibs reserve
#define OVER9000 1234567890
#define tisic 47
#define soclose 1e-8
#define patkan 9
#define ff first
#define ss second
#define abs(x) (((x) < 0)?-(x):(x))
using uint = unsigned int;
using cat = long long;
using dbl = long double;
constexpr dbl pi = 3.14159265358979323846;
using namespace std;

#ifdef DONLINE_JUDGE
	// palindromic tree is better than splay tree!
	#define lld I64d
#endif

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cout << fixed << setprecision(10);
	int N;
	cin >> N;
	vector<int> P(N);
	vector< vector<int> > G(N);
	for(int i = 0; i < N; i++) {
		cin >> P[i];
		if(P[i] > 0) G[--P[i]].push_back(i);
	}
	vector<char> vis(N, 0);
	vector<int> sz;
	queue<int> q;
	for(int i = 0; i < N; i++) if(P[i] == -1) {
		q.push(i);
		int sz_cur = 0;
		while(!q.empty()) {
			sz_cur++;
			vis[q.front()] = 1;
			for(auto s : G[q.front()]) q.push(s);
			q.pop();
		}
		sz.push_back(sz_cur);
	}
	int cyc = 0, K = sz.size();
	for(int i = 0; i < N; i++) if(!vis[i]) {
		cyc++;
		int cur = i;
		for(int j = 0; j < N; j++) cur = P[cur];
		q.push(cur);
		vis[cur] = 1;
		while(!q.empty()) {
			for(auto s : G[q.front()]) if(!vis[s]) {
				vis[s] = 1;
				q.push(s);
			}
			q.pop();
		}
	}
	cat mod = 1000000007;
	vector<cat> cnt(K+1, 0);
	cnt[0] = 1;
	for(int i = 0; i < K; i++) for(int j = K-1; j >= 0; j--)
		cnt[j+1] = (cnt[j+1] + cnt[j] * sz[i]) % mod;
	vector<cat> pw(N+1, 1);
	for(int i = 1; i <= N; i++) pw[i] = (N-1) * pw[i-1] % mod;
	cat ans = pw[K] * (N - cyc) % mod;
	if(K) {
		cat f = 1;
		for(int i = 2; i <= K; i++) {
			f = f * (i-1) % mod;
			ans = (ans - f * pw[K-i] % mod * cnt[i]) % mod;
		}
		for(int i = 0; i < K; i++) ans = (ans - pw[K-1] * (sz[i]-1)) % mod;
	}
	if(ans < 0) ans += mod;
	cout << ans << "\n";
	return 0;
}

// look at my code
// my code is amazing
