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