#include<bits/stdc++.h>
using namespace std;
#define _ 0
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
int f[maxn],vis[maxn];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int n,ans=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>f[i];
    for(int i=1;i<=n;i++)
    {
    	int u=i;
    	while(!vis[u])
    	{
    		vis[u]=i;
    		u=f[u];
		}
		if(vis[u]==i)
			ans=(ans<<1)%mod;
	}
	cout<<ans-1<<endl;
	return ~~(0^_^0);
}

#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
#define int long long
const int MOD=1e9+7;
template<typename T>
void fin(T a){
  cout<<a<<endl;
  exit(0);
}
int pw(int n,int k){
  assert(k>=0);
  int res=1;
  while(k){
    if(k&1)(res*=n)%=MOD;
    (n*=n)%=MOD;
    k>>=1;
  }
  return res;
}
std::vector<int> Factorial(5e6),Finverse(5e6);
inline void Cinit(){
  Factorial[0]=1;
  for(int i=1;i<5e6;i++)Factorial[i]=(Factorial[i-1]*i)%MOD;
  Finverse[4999999]=pw(Factorial[4999999],MOD-2);
  for(int i=4999998;i>=0;i--)Finverse[i]=(i+1)*Finverse[i+1]%MOD;
}
int nCk(int n,int k){
  if(n<k)return 0;if(k<0)return 0;
  if(!Factorial[0])Cinit();
  int res=Factorial[n];
  (res*=Finverse[k])%=MOD;
  (res*=Finverse[n-k])%=MOD;
  return res;
}
char A='A',B='B';

signed main(){
  int n;cin>>n;
  if(n<=3)fin(1);
  vector<char> c(4);//AA,AB,BA,BB
  REP(i,4)cin>>c[i];
  if(c[1]==A)swap(c[0],c[3]),swap(A,B);
  if(c[3]==B)fin(1);
  if(c[2]==B){
    int ans=0;
    for(int k=1;n-k-1>=k-1;k++)ans+=nCk(n-k-1,k-1);
    fin(ans%MOD);
  }
  fin(pw(2,n-3));
}
