o_o 当前时间是:

4:02:17 AM

 

P9836 种树

传送门

solution

首先要知道对于一个整数 a=pα1β1pα2β2pαkβk,它的因数个数是 i=1k(βi+1)。这一点可以通过组合意义证明。

又由于题目要求的是所有数上式的乘积,于是我们可以对值域内每个质数 p 考虑贡献。

如果数 a 所含的 p 的最高次幂的因子是 px,那么如果再给 a 乘上一个 p,答案就变为原来的 x+2x+1 倍。显然 x 越小这个数越大,所以我们每次贪心地把 p 乘给 x 最小的数 a,直接用小根堆动态维护所有 x 即可。

设值域为 W,则时间复杂度为 O(WlnW×nlogn)O(nW),可以通过。

code

#include<bits/stdc++.h>
using namespace std;
using E=long long;
constexpr E mod=998244353;
int main(){
int n,w,W=0;
cin>>n>>w; W=max(W,w);
vector<int> p(n+1);
for(int i=1; i<=n; i++) cin>>p[i],W=max(W,p[i]);
E ans=1;
vector<bool> st(W+1);
for(int i=2; i<=W; i++){
if(st[i]) continue;
for(int j=i*2; j<=W; j+=i) st[j]=1;
priority_queue<int,vector<int>,greater<int>> pq;
for(int j=1; j<=n; j++){
int s=0;
while(p[j]%i==0) s++,p[j]/=i;
pq.push(s);
}
int cnt=0;
while(w%i==0) cnt++,w/=i;
while(cnt){
assert(pq.size());
int u=pq.top();
pq.pop();
pq.push(u+1);
cnt--;
}
while(pq.size()){
ans=ans*(pq.top()+1)%mod;
pq.pop();
}
}
cout<<ans<<endl;
return 0;
}
posted @   zzafanti  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示