LOJ6538 烷基计数

题目传送门

分析:
这牛顿迭代真离谱
首先求烷基的话我们至少可以先找到根的位置
然后找一个生成函数\(f\)表达它
相当于每个点除了父亲还可以连出三个儿子
于是\(f_n=\sum_{i+j+k+1=n}f_{i}f_{j}f_{k}\)
空树时\(f_0=1\)
这个是没有考虑同构,同构时结合polya定理,置换大小为6
手玩一下:
\(f(x)=x\frac{f^3(x)+3f(x)f(x^2)+2f(x^3)}{6}\)
怎么求啊。。。牛顿迭代走起来
\(f_0(x)\)时,我们能够知道\(f_0(x^2),f_0(x^3)\)
套用式子\(f(x)=f_0(x)-\frac{G(f_0(x))}{G'(f_0(x))}\)
化简:

\[f(x)=f_0(x)-\frac{x(f_0^3(x)+3f_0(x)f_0(x^2)+2f_0(x^3))-6f_0(x)+6}{3f_0^2(x)+3f_0(x^2)-6} \]

NTT大礼包。。。

#include
#include
#include
#include

#define maxn 2000005
#define MOD 998244353

using namespace std;

inline int getint()
{
	int num=0,flag=1;char c;
	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
	while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
	return num*flag;
}

int F[maxn],rev[maxn];

inline int upd(int x){return x>=1,num=1ll*num*num%MOD)if(k&1)ret=1ll*ret*num%MOD;
	return ret;
}
inline void getrev(int len)
{for(int i=0;i>1]>>1)|(i&1?len>>1:0);}
inline void NTT(int *A,int len,int opt)
{
	for(int i=0;i

LOJ6538 烷基计数_第1张图片

你可能感兴趣的:(LOJ6538 烷基计数)