2 3 4
4HintFor the sample input, P=3*4=12. Here are the number sequences that satisfy the condition: 2 6 3 4 4 3 6 2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 1005
#define MAXN 20005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
ll n,m,ans,cnt,tot,flag;
ll C[1005][25];
map<ll,ll>mp;
map<ll,ll>::iterator it;
int main()
{
ll i,j,t,p;
for(i=0;i<=1000;i++) // 预处理组合数
{
C[i][0]=1;
}
for(i=1;i<=1000;i++)
{
for(j=1;j<=20;j++)
{
C[i][j]=C[i-1][j]+C[i-1][j-1];
C[i][j]%=mod;
}
}
while(cin>>n)
{
mp.clear();
ll x,y;
for(i=1;i<=n;i++)
{
cin>>t;
y=sqrt(t+0.5);
for(j=2;j<=y&&t>1;j++) // 质因数分解
{
if(t%j==0)
{
while(t%j==0)
{
t/=j;
mp[j]++;
}
}
}
if(t>1) mp[t]++;
}
ans=0;p=1;
for(i=0;i<n;i++)
{
ll tmp=C[n][i];
for(it=mp.begin(); it!=mp.end(); it++)
{
t=it->second;
x=t+n-1-i;
tmp*=C[x][n-1-i];
tmp%=mod;
}
ans+=p*tmp+mod; // 中途可能出现为负数 需加上mod 或者在最后加上再模也可以
ans%=mod; p=-p;
}
cout<<ans<<endl;
}
return 0;
}
周赛 1007 题解 hdu 4390 Number Sequence (质因数分解+组合数学+容斥原理),布布扣,bubuko.com
周赛 1007 题解 hdu 4390 Number Sequence (质因数分解+组合数学+容斥原理)
原文:http://blog.csdn.net/tobewhatyouwanttobe/article/details/20948783