首页 > 其他 > 详细

On Number of Decompositions into Multipliers CodeForces - 396A

时间:2021-09-17 14:38:08      阅读:23      评论:0      收藏:0      [点我收藏+]

原题链接
考察:组合数学
错误思路:
??隔板法忘光了,没做出来= =
思路:
??很容易想到是分解质因数,然后将质因数安排在\(n\)个位置上.这里比较容易想到隔板法,但是注意常规隔板法是需要\(x_i>=1\),所以我们需要将\(x_i+n-1\).还有一个就是质因数排序问题,注意到案例三\(5,7\)做一次隔板少了\(7,5\)这一种情况.将质因数分类考虑,每个做隔板法再相乘即可.

Code

#include <iostream> 
#include <cstring>
#include <map>
using namespace std;
typedef long long LL;
const int N = 510,M = 1000000007,S = 20010;
int a[N],n;
map<int,int> mp;
LL fact[S],infact[S];
void GetDivide(int n)
{
	for(int i=2;i<=n/i;i++)
	{
		if(n%i==0)
			while(n%i==0) n/=i,mp[i]++; 
	}
	if(n>1) mp[n]++;
}
int qsm(int a,int k,int m)
{
	int res = 1;
	while(k)
	{
		if(k&1) res = (LL)res*a%m;
		a = (LL)a*a%m;
		k>>=1;
	}
	return res;
}
void init()
{
	fact[0] = 1,infact[0] = 1;
	for(int i=1;i<S;i++)
	{
		fact[i] = (LL)fact[i-1]*i%M;
		infact[i] = (LL)infact[i-1]*qsm(i,M-2,M)%M;
	}
}
LL C(int a,int b)
{
	if(a<b) return 0;
	return fact[a]*infact[b]%M*infact[a-b]%M;
}
int main()
{
	scanf("%d",&n);
	init();
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		GetDivide(a[i]);
	}
	int res = 1;
	for(auto& it:mp)
	{
		int x = it.second;
		res = (LL)res*C(x+n-1,n-1)%M;
	}
	printf("%d\n",res);
	return 0;
}

On Number of Decompositions into Multipliers CodeForces - 396A

原文:https://www.cnblogs.com/newblg/p/15302960.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!