社区讨论
萌新求助简单生成函数
AT_fps_24_d数列 2参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi8rflns
- 此快照首次捕获于
- 2025/11/21 19:11 3 个月前
- 此快照最后确认于
- 2025/11/21 20:27 3 个月前
做法:
令 为排序后,第 个数为 的方案数,同时令 ,则有:
。
令 ,则有 。然后矩阵快速幂即可。
但是这个做法 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 条回复,欢迎继续交流。
正在加载回复...