P9836 种树

容易想到分解因数。

对于一个数 p p p 的因数个数,假设它可以被分解质因数成 a 1 i 1 a 2 i 2 a 3 i 3 ⋯ a k c k a_1^{i_1} a_2^{i_2} a_3^{i_3}\cdots a_k^{c_k} a1i1a2i2a3i3⋯akck 的形式,则其因数个数为 ( i 1 + 1 ) ( i 2 + 1 ) ( i 3 + 1 ) ⋯ ( i k + 1 ) (i_1+1)(i_2+1)(i_3+1)\cdots(i_k+1) (i1+1)(i2+1)(i3+1)⋯(ik+1)。

我们对序列 p p p 和 w w w 质因数分解之后再考虑这个问题。对于每次从 w w w 拆分出的一个质因子 A A A,我们假设一棵树 p i p_i pi,原来它的贡献为 x x x,对于该棵树高的质因数拆分中质因子 A A A 的出现次数为 t t t,则乘上该质因子之后它的贡献会变为 x ⋅ t + 2 t + 1 x\cdot \dfrac{t+2}{t+1} x⋅t+1t+2,容易证明分子越小即 t t t 越小对答案的贡献越大。

由于数据范围是 1 0 4 10^4 104,质因数的上界是很有限的。设 a ( i , j ) a(i,j) a(i,j) 表示 i j i^j ij 在所有树高的质因数拆分中出现了多少次,每一次取到的一个 w w w 的质因子 A A A,把它计算到当前存在且 k k k 最小的 A k A^k Ak 上即可。

注意筛 n n n 的质因数要筛到 n n n。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int maxn=1e4+5;
int a[maxn][30],ans=1,p[maxn],mod=998244353,n,w;

void calc(int x)
{
	for(int i=2;i<=max(x,w);i++)
	{
		int cnt=0;
		while(x%i==0) x/=i,cnt++;
		a[i][cnt]++;
		ans=ans*(cnt+1)%mod;
		// cout<<cnt<<endl;
	}
}

signed main()
{
	cin>>n>>w;
	for(int i=1;i<=n;i++) cin>>p[i],calc(p[i]);
	// for(int i=1;i<=n;i++) cout<<a[i][1]<<endl;
	for(int A=2;A<=w;A++)
		while(w%A==0)
		{
			int k=0;
			while(!a[A][k]) k++;	
			ans/=(k+1),ans%=mod,ans*=(k+2),ans%=mod;
			w/=A,a[A][k]--,a[A][k+1]++;
			// cout<<w<<endl;
		}	
	cout<<ans;
	return 0;
}
相关推荐
AI科技星23 分钟前
时空的固有脉动:波动方程 ∇²L = (1/c²) ∂²L/∂t² 的第一性原理推导、诠释与验证
数据结构·人工智能·算法·机器学习·重构
2401_841495641 小时前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
罗技1231 小时前
Easysearch 集群监控实战(下):线程池、索引、查询、段合并性能指标详解
前端·javascript·算法
一路往蓝-Anbo1 小时前
C语言从句柄到对象 (七) —— 给对象加把锁:RTOS 环境下的并发安全
java·c语言·开发语言·stm32·单片机·嵌入式硬件·算法
中國龍在廣州1 小时前
谈谈2025年人工智能现状及发展趋势分析
人工智能·深度学习·算法·自然语言处理·chatgpt·机器人·机器人学习
C雨后彩虹1 小时前
二维伞的雨滴效应
java·数据结构·算法·华为·面试
youngee112 小时前
hot100-60子集
数据结构·算法
郝学胜-神的一滴2 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法
Timmylyx05182 小时前
2025年最后一搏—— Educational Codeforces Round 186 (Rated for Div. 2) 题解
算法·codeforces·比赛日记
微光闪现2 小时前
国际航班动态提醒与延误预测优选平台指南
大数据·人工智能·算法