#include<bits/stdc++.h>
using namespace std;
#define sz       200000
#define ll       long long
#define pb       push_back
#define pi       2*acos(0.0)
#define f        first
#define s        second
#define mod      1000000007
#define fastio   {ios_base::sync_with_stdio(false);cin.tie(NULL);}
#define test     ll t; cin>>t; while(t--)
const int N = 1e6;

bool prime[N+5];
void primenire()
{
    int i, j;
    prime[0]=true;
    prime[1]=true;
    for(i=4; i<=N; i+=2)
    {
        prime[i]=true;
    }
    for(i=3; i*i<=N; i+=2)
    {
        if(!prime[i])
        {
            for(j=i*i; j<=N; j+=2*i)
            {
                prime[j]=true;
            }
        }
    }
}


vector<int> node[100003];
int vis[100003];
int dis[100003];
ll cnt,ans;
void dfs(int x)
{
    cnt++;
    vis[x]=1;
    for(int i=0;i<node[x].size();i++)
    {
        int tmp=node[x][i];
        if(!vis[tmp])
        {
            dfs(tmp);
        }
    }
}
ll big_mod(ll base, ll power)
{
    if(power == 0)return 1;
    int h = big_mod(base, power / 2);
    h = (h * h) % mod;
    if(power % 2 )h = (h * base) % mod;
    return h;

}


int main()
{
double a,b;
cin>>a>>b;
double p = (a*1.0/100*1.0);
double pp = (p*1.0*b);
cout<<pp<<endl;
}

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <functional>

using namespace std;

#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define REV(i,n) for(ll (i) = (n) - 1;(i) >= 0;--i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {REP(WW,n)cerr << v[WW] << ' ';cerr << endl;}
#define SHOW2d(v,WW,HH) {REP(W_,WW){REP(H_,HH)cerr << v[W_][H_] << ' ';cerr << endl;}}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 998244353

typedef long long ll;
typedef pair<ll,ll> P;

struct UF {
	vector<int> par; // 親のインデックスを記憶する配列
	vector<int> sz; // サイズを記憶する。
	// 初期化
	UF(int n):par(n),sz(n){
		for(int i = 0; i < n; i++){
			par[i] = i;sz[i] = 1;
		}
	}
	// 親を求める
	int find(int x) {
		if (par[x] == x) return x;
		else return par[x] = find(par[x]);
	}
	// xとyの属する集合を併合
	void unite(int x, int y) {
		x = find(x); y = find(y);
		if (x == y) return;
		if(sz[x] > sz[y])swap(x, y);
		par[x] = y;
		sz[y] += sz[x];
		// マージデクはここでやる(x -> y)
	}
	// xとyが同じ集合ならtrue
	bool same(int x, int y) { return find(x) == find(y); }
	// 素の集合のサイズを求める
	int size(int n){return sz[find(n)];}
};


int main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);

  ll n;cin >> n;
  UF uf(n);
  REP(i, n) {
    ll a;cin >> a;a--;
    uf.unite(i, a);
  }

  ll cou = 0;
  REP(i, n)if(uf.find(i) == i)cou++;
  ll ans = 1;
  REP(i, cou)ans = ans * 2 % MOD;
  cout << (ans + MOD - 1) % MOD << endl;


	return 0;
}
