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. Hive(六):HQL DDL

    HQL语法基于 SqlLine(http://sqlline.sourceforge.net/),DDL主要包含数据库.函数.视图的创建.修改.删除,参考资料:(https://cwiki.apach ...

  2. ShopEX 4.8.5.81822 前台Getshell

    ShopEX 4.8.5.81822 前台Getshell 作者:unhonker   发布:2014-06-23 00:12   分类:漏洞公布   被撸:8,179次   抢沙发     利用方式 ...

  3. java 输入输出项目

    package hellohe; import java.util.Scanner; /** * * @author Administrator *1.导入java.util.scanner; *2. ...

  4. VS2012远程调试(winform+web 远程调试)

    VS2012远程调试   一.调试WinFrom 程序 安装rtools_setup_x64 下载 配置Remote 启动Remote debugger 默认端口4016,选择工具-〉选项,选择 无身 ...

  5. golang的ssh例子

    package main import ( "github.com/dynport/gossh" "log" ) func MakeLogger(prefix ...

  6. 【原】sql 查询结果合为一行

    SELECT COUNT(*) AS AllCount,t.AssignedCount,(COUNT(*)-t.AssignedCount) AS UnassignedCountFROM 药品表jOI ...

  7. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  8. Authentication token manipulation error for ubuntu ubuntu-16.04.1-desktop-amd64

    https://ubuntuforums.org/showthread.php?t=1772894 Hi, I faced the same problem when I tried to recov ...

  9. HDU 4539 郑厂长系列故事――排兵布阵(曼哈顿距离)

    这虽然是中文题,然而没看懂,不懂的地方,就是在曼哈顿距离这块,网上搜索了一下,写了个程序,是测试曼哈顿距离的. 曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2| ...

  10. C#(类)

    一.String类 string s = " abCDefgb ";int a = s.Length;//获取长度 Console.WriteLine(s.Length); Con ...