#include<bits/stdc++.h>
using namespace std;
const int MOD= 1e9+7;
const int N= 1e6+1;
int f[N],depth[N],vis[N];
long long int ans=1;
int n,k;
int dfs(int node)
{
if(vis[node])
{
if(depth[node]==-1)
return k;
else
return (depth[node]-1);
}
else{
vis[node]=1;
if(f[node]==node)
{
depth[node]=k;
ans*=k;
ans%=MOD;
return (depth[node]-1);
}
else
{
depth[node] = dfs(f[node]);
// cout<<node<<" "<<depth[node]<<endl;
ans*=depth[node];
ans%=MOD;
return (depth[node]-1);
}
}
}
int main() {
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>f[i],depth[i]=-1,vis[i]=0;
for(int i=1;i<=n;i++)
{
int st=i;
while(!vis[st])
{
dfs(st);
}
}
cout<<ans;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNT0Q9IDFlOSs3Owpjb25zdCBpbnQgTj0gMWU2KzE7CmludCBmW05dLGRlcHRoW05dLHZpc1tOXTsKbG9uZyBsb25nIGludCBhbnM9MTsKaW50IG4sazsKaW50IGRmcyhpbnQgbm9kZSkKewogICAgaWYodmlzW25vZGVdKQogICAgewogICAgICAgIGlmKGRlcHRoW25vZGVdPT0tMSkKICAgICAgICAgIHJldHVybiBrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIChkZXB0aFtub2RlXS0xKTsKICAgIH0KICAgICAgICAKICAgIGVsc2V7CiAgICAgICAgdmlzW25vZGVdPTE7CiAgICAgICAgaWYoZltub2RlXT09bm9kZSkKICAgICAgICB7CiAgICAgICAgICAgIGRlcHRoW25vZGVdPWs7CiAgICAgICAgICAgIGFucyo9azsKICAgICAgICAgICAgYW5zJT1NT0Q7CiAgICAgICAgICAgIHJldHVybiAoZGVwdGhbbm9kZV0tMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBkZXB0aFtub2RlXSA9IGRmcyhmW25vZGVdKTsKICAgICAgICAgICAvLyBjb3V0PDxub2RlPDwiICI8PGRlcHRoW25vZGVdPDxlbmRsOwogICAgICAJICBhbnMqPWRlcHRoW25vZGVdOwogICAgICAgICAgYW5zJT1NT0Q7CiAgICAgICAgICByZXR1cm4gKGRlcHRoW25vZGVdLTEpOwogICAgICAgIH0KCiAgICB9Cn0KaW50IG1haW4oKSB7CgogICAgY2luPj5uPj5rOwogICAgCiAgICAKICAgIAogICAgZm9yKGludCBpPTE7aTw9bjtpKyspCiAgICAgICAgY2luPj5mW2ldLGRlcHRoW2ldPS0xLHZpc1tpXT0wOwogICAgCiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykKICAgIHsKICAgICAgICBpbnQgc3Q9aTsKICAgICAgICB3aGlsZSghdmlzW3N0XSkKICAgICAgICB7CiAgICAgICAgICAgIGRmcyhzdCk7CiAgICAgICAgfSAgCiAgICB9CiAgICBjb3V0PDxhbnM7CiAgICByZXR1cm4gMDsKfQ==