「DROI」Round 2 单图 题解
Demeanor_Roy · · 题解
- 出题人题解。
第一档考虑手玩或爆搜,接下来从第二档讲起。
考虑图
可这是有问题的,因为存在一个反例,即两点环。不难发现若图中一两点环与外界不联通,显然也无法据此构造出与其本质相同的图。所以需分两种情况讨论。
思考如何计数,对于一个
先思考
那么
故暴力求解可做到
显然可以优化到 不过并不美丽也无甚价值 。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1010;
int T,n,mod,fct[N],ans[N],C[N][N];
inline int pwr(int x,int y)
{
int res=1;
while(y)
{
if(y&1) res=(LL)res*x%mod;
x=(LL)x*x%mod;y>>=1;
}
return res;
}
inline void init()
{
ans[0]=C[0][0]=C[1][0]=C[2][0]=fct[1]=1;
for(int i=3;i<N;i++) C[i][0]=1,fct[i]=(i&1?(LL)fct[i-2]*i%mod:0);
for(int i=1;i<N;i++)
for(int j=1;j<=i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
for(int i=1;i<N;i++)
for(int j=0;j<i;j++)
ans[i]=(ans[i]+(LL)C[i][j]*pwr(pwr(2,i-j)-1,j)%mod)%mod;
}
inline void solve()
{
scanf("%d",&n);
int res=ans[n];
for(int i=2;i<=n;i+=2) res=(res+(LL)C[n][i]*fct[i-1]%mod*ans[n-i]%mod)%mod;
printf("%d\n",res);
}
int main()
{
scanf("%d%d",&T,&mod);
init();
while(T--) solve();
return 0;
}