每条边至多在一个环里面。
难点就是环里面有多少种选择。
f[1] = k;
f[2] = f[1]*(k-1);
f[3] = f[2]*(k-2);
for(int x=4; x<=n; x++)
f[x] = (k-1)*f[x-2]+(k-2)*f[x-1];
就是往x-2的环里面加两个点,有 (k-1)*f[x-2]种;
往x-1里面加一个点,有(k-2)*f[x-1]种。
最后剩下m个不在环里的。一定存在点与环有边。如果已经算出环的结果,他有(k-1)种选择。以此类推其他点。
const int N = 111111;
const LL mod = 1000000007;
int to[N], vis[N], st[N];
int tp, n, k;
LL f[2222];
LL ans;
LL pow(LL x, int n)
{
LL ans = 1, tmp = x;
while(n)
{
if(n&1) ans *= tmp;
tmp *= tmp;
ans %= mod;
tmp %= mod;
n>>=1;
}
return ans;
}
void init()
{
f[1] = k;
f[2] = f[1]*(k-1);
f[3] = f[2]*(k-2);
for(int x=4; x<=n; x++)
f[x] = ((LL)(k-1)*f[x-2]+(LL)(k-2)*f[x-1])%mod;
}
void dfs(int u, int id)
{
do{
vis[u] = id;
st[tp++] = u;
u = to[u];
}while(!vis[u]);
if(vis[u]==id){
int t = 0;
while(st[tp-1]!=u) --tp, ++t;
--tp, ++t;
ans *= f[t];
ans %= mod;
}
}
int main()
{
int t, i;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &k);
init();
for(i=0; i<n; i++) scanf("%d", &to[i]);
memset(vis, 0, sizeof(vis));
ans = 1LL;
tp = 0;
for(i=0; i<n; i++)
if(vis[i]==0) dfs(i, i+1);
ans *= pow(k-1, tp); //长度为tp的链
cout<<ans%mod<<endl;
}
return 0;
}