专栏文章
题解:CF288B Polo the Penguin and Houses
CF288B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min02sxj
- 此快照首次捕获于
- 2025/12/01 18:22 3 个月前
- 此快照最后确认于
- 2025/12/01 18:22 3 个月前
这题很明显可以分成两个部分来求解,分别是编号为 到 的部分和编号为 到 的部分,最后再乘法原理乘起来。
先看编号为 到 。发现 最大只有 ,尝试暴力搜索打表。
的暴搜代码
CPPvoid 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);
}
}
记 为这部分的结果,可以发现:
- 时,。
- 时,。
- 时,。
- 时,。
- 时,。
- 时,。
- 时,。
- 时,。
可以发现规律 。
再看第二部分。这部分不可能有数字指向 到 ,否则会违反条件 2,所以只能指向 到 共 个。而这部分共有 个房屋,每个都可以选 种数,那最后就有 种情况。
最后把两部分相乘,得到结果为 。
code
CPP#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...