/*input
2
1 1



*/


// assic value of ('0'-'9') is(48 - 57) and (a-z) is (97-122) and (A-Z) is(65-90) and 32 for space
// #pragma GCC target ("avx2")
// #pragma GCC optimization ("O3")
// #pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;

// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
using namespace __gnu_pbds;
template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define ll          long long int
#define pb          push_back
#define pii         pair<ll ,ll >
#define vpii        vector< pii >
#define vi          vector<ll >
#define vs			vector< string >
#define vvi         vector< vector< ll > >
#define inf			(ll)1e18
#define all(it,a)   for(auto it=(a).begin();it!=(a).end();it++) 
#define F           first
#define S           second
#define sz(x)       (ll )x.size()
#define rep(i,a,b)	for(ll  i=a;i<b;i++)
#define repr(i,a,b) for(ll  i=a;i>b;i--)
#define lbnd        lower_bound
#define ubnd        upper_bound
#define mp          make_pair
#define whatis(x)   cout << #x << " is " << x << "\n";
#define graph(n)    adj(n,vector< ll > () )
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#define debug(x)     cout << #x << " " << x << endl;
#define debug_p(x)   cout << #x << " " << x.F << " " << x.S << endl;
#define debug_v(x)   {cout << #x << " "; for (auto ioi : x) cout << ioi << " "; cout << endl;}
#define debug_vp(x)  {cout << #x << " "; for (auto ioi : x) cout << '[' << ioi.F << " " << ioi.S << ']'; cout << endl;}
#define debug_v_v(x) {cout << #x << "/*\n"; for (auto ioi : x) { for (auto ioi2 : ioi) cout << ioi2 << " "; cout << '\n';} cout << "*/" << #x << endl;}
const ll NMax = 2e5+5,mod = 998244353;
vvi adj(NMax);
vi vis(NMax,0);
void dfs(ll u){
	vis[u] = 1;
	for(ll ch : adj[u]){
		if(vis[ch]==0) dfs(ch);
	}
	return ;
}

int solve()
{
	ll N;cin>>N;
	vi f(N);
	rep(i,0,N) { cin>>f[i]; f[i]--;  adj[i].pb(f[i]); adj[f[i]].pb(i); }

	ll ans = 0;
	rep(i,0,N){
		if(vis[i]==0){
			dfs(i);
			ans++;
		}
	}

	ll temp = 1;
	while(ans--) temp = (temp * 2)%mod;
	temp = (temp - 1)%mod;
	if(temp<0) temp+=mod;
	cout<<temp<<"\n";

	return 0;
}

int main()
{
	auto start = chrono::high_resolution_clock::now();

    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	ll test_cases=1;
	//cin>>test_cases;
	while(test_cases--)
		solve();

	auto stop = chrono::high_resolution_clock::now();
	auto duration = chrono::duration_cast<chrono::milliseconds>(stop-start);
	//cout<<"\nduration: "<<(double)duration.count()<<" milliseconds";
}
// Problem: B - Special Subsets
// Contest: AtCoder - AtCoder Regular Contest 114
// URL: https://atcoder.jp/contests/arc114/tasks/arc114_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define debug(a) cout << #a << ": " << a << endl
#define false_stdio ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int maxn=2e5+5;

typedef long long ll;
using namespace std;
const ll mod=998244353;
int n;
ll cnt;
bool vis[maxn];
int f[maxn];
set<int> s;

bool dfs(int u){
	if(vis[u]) {
		if(s.count(u)) return 1;
		else return 0;
	}
	vis[u]=1;
	s.insert(u);
	return dfs(f[u]);
}

ll pow2(ll base,ll sup){
	ll res=1;
	while(sup){
		if(sup&1)res=res*base%mod;
		base=base*base%mod;
		sup>>=1;
	}
	return res;
}

int main() {
    false_stdio;
	cin>>n;
	for(int i=1;i<=n;i++){
		int v;cin>>v;
		f[i]=v;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			s.clear();
			if(dfs(i)) cnt++;
		}
	}
	// debug(cnt);
	cout<<(pow2(2,cnt)-1+mod)%mod<<endl;
    return 0;
}