题解:CF288B Polo the Penguin and Houses
这题很明显可以分成两个部分来求解,分别是编号为
先看编号为
::::info[
void dfs(int x)
{
if(x>m)
{
for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)c[i][j]=0;
for(int i=1;i<=m;i++)c[i][a[i]]=1;
for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)for(int l=1;l<=m;l++)if(c[j][i] && c[i][l])c[j][l]=1;
int t=1;
for(int i=1;i<=m;i++)if(c[i][1]==0)t=0;
s+=t;
s%=mod;
return;
}
for(int i=1;i<=m;i++)
{
a[x]=i;
dfs(x+1);
}
}
::::
记
可以发现规律
再看第二部分。这部分不可能有数字指向
最后把两部分相乘,得到结果为
::::success[code]
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3e5+5,mod=1e9+7;
int n,m;
int ksm(int A,int B)
{
int S=1;
while(B)
{
if(B&1)S*=A,S%=mod;
A*=A,A%=mod;
B>>=1;
}
return S;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int s=1;
for(int i=1;i<m;i++)s*=m,s%=mod;
int k=ksm((n-m)%mod,n-m);
cout<<s*k%mod;
return 0;
}
::::