Number Sequence

Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Problem Description
Given a number sequence b1,b2…bn. Please count how many number sequences a1,a2,...,an satisfy the condition that a1*a2*...*an=b1*b2*…*bn (ai>1).
 
Input
The input consists of multiple test cases. For each test case, the first line contains an integer n(1<=n<=20). The second line contains n integers which indicate b1, b2,...,bn(1<bi<=1000000, b1*b2*…*bn<=1025).
 
Output
For each test case, please print the answer module 1e9 + 7.
 
Sample Input
2 3 4
 
Sample Output
4

Hint

For the sample input, P=3*4=12. Here are the number sequences that satisfy the condition:

2 6
3 4
4 3
6 2
 
Source
 
 

将每一个数分解质因数,得到每个质因数出现的次数(和质数本身没有关系),然后就要用到容斥原理了,

也就是将每个质数出现的次数放到n个容器中去,这里要注意下1的情况也就是某个容器里面没有放数。

这样结果=总的方案数-有一个容器没放数+有2个容器没有放数……

将m个数放入n个容器的方法数有C(n+m-1,n-1) 。

#include <iostream>
#include <stdio.h>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <stack>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
typedef long long LL ;
const int M_P= ;
const LL Mod= ;
bool isprime[M_P+] ;
int prime[M_P] ,id;
map<int ,int>my_hash ;
map<int ,int>::iterator p ;
void make_prime(){
id= ;
memset(isprime,,sizeof(isprime)) ;
for(int i=;i<=M_P;i++){
if(!isprime[i])
prime[++id]=i ;
for(int j= ;j<=id&&i*prime[j]<=M_P;j++){
isprime[i*prime[j]]= ;
if(i%prime[j]==)
break ;
}
}
}
LL C[][] ;
void get_C(){
C[][]=C[][]= ;
for(int i=;i<=;i++){
C[i][]=C[i][i]= ;
for(int j=;j<i;j++){
C[i][j]=C[i-][j-]+C[i-][j] ;
if(C[i][j]>=Mod)
C[i][j]%=Mod ;
}
}
}
void gao(int N){
for(int i=;i<=id&&prime[i]*prime[i]<=N;i++){
if(N%prime[i]==){
while(N%prime[i]==){
my_hash[prime[i]]++ ;
N/=prime[i] ;
}
}
if(N==)
break ;
}
if(N!=)
my_hash[N]++ ;
}
vector<int>vec ;
int N ;
LL Sum(){
LL ans= ;
for(int k=;k<vec.size();k++){
ans*=C[vec[k]+N-][N-] ;
if(ans>=Mod)
ans%=Mod ;
}
for(int i=;i<=N;i++){
LL sum=C[N][i] ;
for(int k=;k<vec.size();k++){
int m=N-i ;
sum*=C[vec[k]+m-][m-] ;
if(sum>=Mod)
sum%=Mod ;
}
if(i&)
ans-=sum ;
else
ans+=sum ;
ans=(ans%Mod+Mod)%Mod ;
}
return ans ;
}
int main(){
make_prime() ;
get_C() ;
int M ;
while(scanf("%d",&N)!=EOF){
my_hash.clear() ;
vec.clear() ;
for(int i=;i<=N;i++){
scanf("%d",&M) ;
gao(M) ;
}
for(p=my_hash.begin();p!=my_hash.end();p++)
vec.push_back(p->second) ;
cout<<Sum()<<endl;
}
return ;
}

HDU 4390 Number Sequence 容斥原理的更多相关文章

  1. HDU 4390 Number Sequence (容斥原理+组合计数)

    HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...

  2. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  3. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  4. HDU 1005 Number Sequence(数论)

    HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...

  5. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  6. HDU - 1005 Number Sequence 矩阵快速幂

    HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...

  7. HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. HDU 1711 Number Sequence (KMP简单题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. 【oracle】 linux 下oracle 启动监听错误

    Message 1070 not found; No message file for product=network, facility=TNSTNS-12545: Message 12545 no ...

  2. JABX简单介绍

    主要引至http://suo.iteye.com/blog/1233458 一.简介 1.概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,是一项可 ...

  3. jQuery Wookmark 瀑布流布局

    瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...

  4. js cookie操作

    //写Cookie function writeCookie(name, value) { var expire = new Date(); expire.setFullYear(expire.get ...

  5. android学习笔记六——Spinner

    注:参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0105/2264.html Spinner ==> Spinner ...

  6. WeX5和BeX5比较

    http://wex5.com/cn/wex5和bex5比较/ WeX5和BeX5比较 许多对WeX5和BeX5略有了解得人都知道,WeX5和BeX5是完全共用前端框架技术的.但是WeX5和BeX5是 ...

  7. purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0

    purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0 你在iOS6下使用3G网络时可能会遇到这条log,不用紧张,这只是苹果的工 ...

  8. UVA 11137 Ingenuous Cubrency(dp)

    Ingenuous Cubrency 又是dp问题,我又想了2 30分钟,一点思路也没有,最后又是看的题解,哎,为什么我做dp的题这么烂啊! [题目链接]Ingenuous Cubrency [题目类 ...

  9. cf 645F Cowslip Collections 组合数学 + 简单数论

    http://codeforces.com/contest/645/problem/F F. Cowslip Collections time limit per test 8 seconds mem ...

  10. Oracle数据库 External component has thrown an exception

    出现这种错误一般是在SQL语句执行前就报出的错误.这样的错误一般需要仔细检查SQL语句,以及参数的数据类型. 而在cmd.ExecuteNonQuery()中出现的错误,则很可能就排除了语法类的错误. ...