社区讨论

萌新求助简单生成函数

AT_fps_24_d数列 2参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi8rflns
此快照首次捕获于
2025/11/21 19:11
3 个月前
此快照最后确认于
2025/11/21 20:27
3 个月前
查看原帖
做法:
dpi,jdp_{i,j} 为排序后,第 j+j+ 个数为 ii 的方案数,同时令 fi(x)=j=0dpi,jxjf_i(x)=\sum\limits_{j=0}^{\infty}dp_{i,j}x^j,则有:
fi(x)=1+j<i(ij)mod2=1xfj(x)f_i(x)=1+\sum\limits_{j<i\land(i-j)\mod 2=1} xf_j(x)
gi(x)=j<i(ij)mod2=0fi(x)g_i(x)=\sum\limits_{j<i\land(i-j)\mod 2=0}f_i(x),则有 gi(x)=1+gi2(x)+xgi1(x)g_i(x)=1+g_{i-2}(x)+xg_{i-1}(x)。然后矩阵快速幂即可。

但是这个做法 WA 了一个点,有没有好心人帮忙看看/kel
CPP
#include<bits/stdc++.h>
#include<atcoder/all>
#define int long long
#define endl '\n'
using namespace atcoder;
using namespace std;
const int N = 2e5 + 5,mod = 998244353;
int frac[N];
int qpow(int a,int b){
	int ans = 1;
	while(b){
		if(b & 1)ans = ans * a % mod;
		a = a * a % mod,b >>= 1;
	}
	return ans;
}
int C(int n,int m){
	if(n < m)return 0;
	return frac[n] * qpow(frac[m] * frac[n - m] % mod,mod - 2) % mod;
}
void init(int n){
	frac[0] = 1;
	for(int i = 1;i <= n;i++)frac[i] = frac[i - 1] * i % mod;
}
struct matrix{
	vector<int> a[3][3];
}base,tmp;
void add(vector<int> &a,const vector<int> &b){
	while(a.size() < b.size())a.push_back(0);
	for(int i = 0;i < b.size();i++)a[i] = (a[i] + b[i]) % mod;
}
matrix operator*(const matrix &a,const matrix &b){
	matrix c;
	for(int i = 0;i < 3;i++){
		for(int k = 0;k < 3;k++){
			for(int j = 0;j < 3;j++){
				add(c.a[i][j],convolution(a.a[i][k],b.a[k][j]));
			}
		}
	}
	return c;
}
matrix qpow(matrix a,int b){
	b--;
	matrix ans = a;
	while(b){
		if(b & 1)ans = ans * a;
		a = a * a,b >>= 1;
	}
	return ans;
}
int n,m;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	base.a[0][1].push_back(1);
	base.a[1][0].push_back(1);
	base.a[1][1].push_back(0);
	base.a[1][1].push_back(1);
	base.a[2][1].push_back(1);
	base.a[2][2].push_back(1);
	tmp.a[0][0].push_back(1);
	tmp.a[0][1].push_back(1),tmp.a[0][1].push_back(1);
	tmp.a[0][2].push_back(1);
	matrix ans = (tmp * qpow(base,m - 1));
	init(n);
	cout << (ans.a[0][0][n - 1] + ans.a[0][1][n - 1]) * frac[n] % mod;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...