T3 Walk
有环
考虑减去环
记
f
l
f_l
fl为长
l
l
l的、可能自交的环的个数,有转移:
f
l
=
∑
i
=
1
⌊
l
2
⌋
(
l
i
)
(
l
−
i
i
)
(
l
−
2
i
l
−
2
i
2
)
f_l=\sum_{i=1}^{\lfloor\frac{l}{2}\rfloor}\binom{l}{i}\binom{l-i}{i}\binom{l-2i}{\frac{l-2i}{2}}
fl=i=1∑⌊2l⌋(il)(il−i)(2l−2il−2i)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mgXfIRvk-1603802080884)(C:\Users\am\AppData\Roaming\Typora\typora-user-images\image-20201027192055412.png)]
记
g
l
g_l
gl为长
l
l
l的简单环个数,有转移:
g
l
=
f
l
−
∑
i
=
1
l
−
1
g
i
f
l
−
i
g_l=f_l-\sum_{i=1}^{l-1}g_if_{l-i}
gl=fl−i=1∑l−1gifl−i
注意
f
l
,
g
l
f_l,g_l
fl,gl的
l
l
l都是偶数,因为没有奇数的环
如果for l step 1
了正确性有问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qaC2Of8-1603802080890)(C:\Users\am\AppData\Roaming\Typora\typora-user-images\image-20201027192140014.png)]
枚举从何处开始绕环,有答案
a
n
s
=
(
n
+
1
)
4
n
−
∑
l
=
1
n
4
n
−
l
g
l
(
n
−
l
+
1
)
ans=(n+1)4^n-\sum_{l=1}^n4^{n-l}g_l(n-l+1)
ans=(n+1)4n−l=1∑n4n−lgl(n−l+1)
#include<bits/stdc++.h>
using namespace std;
#define in Read()
#define int long long
int in{
int i=0,f=1;char ch=0;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') f=-1,ch=getchar();
while(isdigit(ch)) i=(i<<1)+(i<<3)+ch-48,ch=getchar();
return i*f;
}
const int N=5e3+5;
int n,mod,fac[N],ifac[N],f[N],g[N],ans;
int C[N][N];
int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
int dec(int a,int b){return a<b?a+mod-b:a-b;}
int mul(int a,int b){return 1ll*a*b%mod;}
void Add(int &a,int b){a=add(a,b);}
void Dec(int &a,int b){a=dec(a,b);}
void Mul(int &a,int b){a=mul(a,b);}
int qpw(int a,int b){
int res=1;
while(b){
if(b&1) Mul(res,a);
Mul(a,a);
b>>=1;
}
return res;
}
signed main(){
// freopen("1.in","r",stdin);
n=in,mod=in;
C[0][0]=1;
for(int a=1;a<=n;++a){
C[a][0]=1;
for(int b=1;b<=a;++b)
C[a][b]=add(C[a-1][b],C[a-1][b-1]);
}
for(int l=2;l<=n;l+=2)
for(int i=0;i<=(l>>1);++i)
Add(f[l],mul(mul(C[l][i],C[l-i][i]),C[l-2*i][(l-2*i)/2]));
for(int l=2;l<=n;l+=2){
g[l]=f[l];
for(int i=1;i<l;++i)
Dec(g[l],mul(g[i],f[l-i]));
}
ans=mul(qpw(4,n),n+1);
for(int l=2;l<=n;l+=2)
Dec(ans,mul(mul(g[l],qpw(4,n-l)),(n-l+1)));
printf("%lld\n",ans);
return 0;
}