【写题解才是正经事】CF396A题解
思路
首先我们已知 $m=\prod_{i=1}^na_i$,而 $1\le a_i \le 10^9,1\le n \le 500$,显然不可能直接将所有 $a_i$ 乘起来,那这一题怎么做呢?
但是题目要求的是所有元素乘起来的值 $\prod_{i=1}^nb_i=m$ 的长度为 $n$ 的数组 $b$ 的总数,而且我们有唯一分解定理:
对于任意一个正整数 $d$,有:
$$d=p_1^{s_1}\times p_2^{s_2}\times ...\times p_u^{s_u}$$
其中 $p_1 < p_2 <...<p_u$ 且均为质数,数组 $s$ 均为正整数。
显然,给一个数的因数分解质因数等价于给这个数分解质因数。
所以对数组 $a$ 的每个元素分解质因数,再去计算满足所有元素分解质因数后与数组 $a$ 所有元素分解质因数的结果相同的 $b$ 数组的总数就好了。
然而问题又来了:怎样计算 $b$ 数组的总数?
设数组 $a$ 的每个元素分解质因数后一共有 $p$ 个不同的质数,第 $i$ 个质数出现了 $c_i$ 次。
根据组合数学隔板法,把问题转化为:假设一种质因数有 $q$ 种,现在有 $n$ 个箱子,每个箱子都可以放一些这个质因数或不放,但总数必须是 $q$ 个,则有:$C^{n-q+1}_{n-1}$ 种放法。
所以最终答案为:
$$\prod^{p}_{i=1}C^{n-c_i+1}_{n-1}$$
计算答案时,可以用 Lucas 定理来求组合数 $C$。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;//sqrt(1e9)近似等于 4e5,保险起见开到 5e5
const long long mod=1e9+7;
long long N,k,ans=1;
int p[maxn],v[maxn];
map<long long,long long>mp;
void Prime() {//欧拉筛板子
for (int i=2;i<= maxn;i++) {
if (!v[i])p[++p[0]] = i;
for (int j=1;j<=p[0];j++) {
if (i*p[j]>maxn) break;
v[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
long long KSM(long long a,long long b,long long p) {//快速幂板子
long long ans=1;
while(b) {
if(b&1)ans=(ans*a)%mod;
a=(a*a)%mod;
b/=2;
}
return ans;
}
long long C(long long a,long long b) {
if(a<b)return 0;
if(a==b)return 1;
if(b>a-b)b=a-b;
long long A=1,B=1;
for(long long i=0; i<b; ++i) {
A=(A*(a-i))%mod;
B=(B*(b-i))%mod;
}
return (A*KSM(B,mod-2,mod));
}
long long Lucas(long long n,long long m) {//Lucas板子
if(m==0)return 1;
return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}
void fj(long long a) {//分解质因数
for(int i=1; p[i]<=a&&p[i]; i++) while(a%p[i]==0)mp[p[i]]++,a/=p[i];
if(a!=1)mp[a]++;
}
int main() {
Prime();
scanf("%lld",&N);
for(int i=1; i<=N; i++) {
scanf("%lld",&k);
fj(k);
}
for(auto it=mp.begin(); it!=mp.end(); it++)ans=ans*Lucas(N+(it->second)-1,N-1)%mod;//使用指针来遍历整个map
printf("%lld",ans);//输出
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!