C. Little Alawn‘s Puzzle
我的思路:
数据结构知识有限,还没搞很懂,暂时明白了本题转换为n个节点,有n条有向边(我暂时觉得是有向边),组成一个图,之后用深搜在图中找到环。最后用快速幂压缩时间复杂度
复制了一下大佬的代码,图论的知识再去学一学
分类:数学建模,图论,快速幂
大佬的代码:
#include <iostream>
using namespace std;
const int maxn = 4e5+10;
const int mod = 1e9+7;
int vis[maxn],pos[maxn],ans,chu,n;
int a[maxn],b[maxn];
void dfs(int u)
{
vis[u] = 1;
if( b[u]==chu ){ ans++; return; }
dfs( pos[b[u]] );
}
int quick(int x,int n)
{
int ans = 1;
for( ; n ; n>>=1,x=1ll*x*x%mod )
if( n&1 ) ans = 1ll*ans*x%mod;
return ans;
}
int main()
{
int t; cin >> t;
while( t-- )
{
ans = 0;
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cin >> b[i], pos[a[i]] = i;
for(int i=1;i<=n;i++)
{
if( vis[i] ) continue;
chu = a[i];
dfs( i );
}
cout << quick(2,ans)%mod << endl;
for(int i=1;i<=n;i++) vis[i] = 0;
}
return 0;
}