[ARC192D] Fraction Line 题解
令
对于每个质因数
考虑求解这个修改后的问题:对题目中的
令
上述的
时间复杂度
放代码:
#include<bits/stdc++.h>
using namespace std;
const int P=998244353,V=1e3;
inline void chadd(int &x,int y){
if((x+=y)>=P)x-=P;
}
bitset<V+1> b;
int main(){
ios::sync_with_stdio(false);
int n,q=1; cin>>n;
vector<int> a(n-1),p;
vector c(n-1,vector<int>(V+1));
for(auto &i:a)cin>>i;
for(int i=0;i<n-1;i++){
int x=a[i];
for(int j=2;j*j<=x;j++)
while(!(x%j))c[i][j]++,x/=j;
if(x>1)c[i][x]++;
} // 进行分解质因数
for(int i=2;i<=V;i++)
if(!b[i]){
p.emplace_back(i);
for(int j=i<<1;j<=V;j+=i)
b[j]=true;
} // 筛质数
for(int i:p){
int s=1,w=0;
for(int j=0;j<n-1;j++)
s+=c[j][i];
vector f(s+1,vector<int>(2));
vector<int> pw(s+1);
for(int j=0;j<=s;j++)
f[j][!j]=pw[j]=j?1ll*pw[j-1]*i%P:1;
// 预处理 p 的 k 次幂,作为 DP 初始值
for(int j=0;j<n-1;j++){
vector g(s+1,vector<int>(2));
for(int k=0;k<=s;k++)
for(int b=0;b<2;b++){
if(k+c[j][i]<=s)chadd(g[k+c[j][i]][b|!(k+c[j][i])],1ll*f[k][b]*pw[k+c[j][i]]%P);
if(c[j][i]&&k>=c[j][i])chadd(g[k-c[j][i]][b|!(k-c[j][i])],1ll*f[k][b]*pw[k-c[j][i]]%P);
}
f=g;
} // 模拟上述的 DP 过程
for(auto v:f)chadd(w,v[1]);
q=1ll*q*w%P; // 将所有答案相乘
}
cout<<q<<endl;
return 0;
}