HDU 4390

题意:

大概就是这样。不翻译了:

Given a number sequence b1,b2…bn.

Please count how many number sequences a1,a2,...,ansatisfy the condition thata1∗a2∗...∗an=b1∗b2∗…∗bn(ai,bi>1).

思路:

我们能够确定一件事:等号两边由同样数量的质因子组成。

假设ai能够等于1,答案就是把这些质因子分配进n个位置的方案数。

设左边的数字共由x个质因子组成,当中第i个质因子出现mi次。

把m个同样小球放进n个不同盒子(盒子能够为空)中的方案数是 Cn−1m+n−1。

那么把mi个同样质因子放进n个不同位置上的方案数是 Cn−1mi+n−1。最后答案就是∏xi=1Cn−1mi+n−1.

但这并非我们想要的答案。由于我们不同意某个位置为空(即存在ai=1),所以我们要减去一些某些位置为空的方案。

由于至少有一个位置为空与至少有两个位置为空存在反复情况等。减的方法是容斥原理。

ans=∏xi=1Cn−1mi+n−1−C1n∏xi=1Cn−2mi+n−2+C2n∏xi=1Cn−3mi+n−3−...Cn−1n∏xi=1C0mi.

(答案 = 全部可能 - 一个为空 + 两个为空 - 三个为空 +…)

代码:

/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue> using namespace std; #define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL; const int maxn = 1005 ;
const int mod = 1e9 + 7 ;
lint C[505][505];
lint b[25] ;
map<int , int>m ; int n ;
void init(){
cls( C ) ;
C[0][0] = 1 ;
for( int i = 1 ; i <= 500 ; i++ ){
C[i][0] = 1 ;
for( int j = 1 ; j <= i ; j++ ){
C[i][j] = C[i-1][j] + C[i-1][j-1] ;
if( C[i][j] > mod ) C[i][j] -= mod ;
}
}
} lint work(){
for( int i = 1 ; i <= n ; i++ ){
for( int j = 2 ; j * j <= b[i] ; j++ ){
while( b[i] % j == 0 ) {
m[j] ++ ;
b[i] /= j ;
}
}
if( b[i] > 1 ) m[b[i]] ++ ;
}
map<int,int>::iterator it ; lint ans = 1 ;
for( it = m.begin() ; it != m.end() ; it++ ){
int num = it->second ;
ans = ( ans * C[ num + n - 1 ][ n - 1 ] ) % mod ;
}
for( int i = 1 ; i < n ; i++ ){
lint val = C[n][i] ;
for( it = m.begin() ; it != m.end() ; it++ ){
int num = it->second ;
val = ( val * C[ num + n - i - 1 ][ n - i - 1 ] ) % mod ;
}
if( i & 1 )
ans = ( ans - val + mod ) % mod ;
else
ans = ( ans + val ) % mod ;
}
return ans ; }
int main(){
// freopen("input.txt","r",stdin);
init() ;
while( cin >> n ){
m.clear();
for( int i = 1 ; i <= n ; i++ )
cin >> b[i] ;
cout << work() << endl;
}
return 0;
}

HDU 4390 Number Sequence (容斥原理+组合计数)的更多相关文章

  1. HDU 4390 Number Sequence 容斥原理

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

  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. 关于server和虚拟主机的差别

    文章都是先由本人个人博客,孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新.掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/guan-yu-y ...

  2. java 中的静态(static)代码块

    类字面常量 final 静态域不会触发类的初始化操作 非 final static 静态域(以及构造器其实是一种隐式的静态方法) Class.forName():会自动的初始化: 使用 .class来 ...

  3. Java-MyBatis:MyBatis 中 in 的用法

    ylbtech-Java-MyBatis-杂项:MyBatis  中  in 的用法 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元 ...

  4. BZOJ 4004 高斯消元

    思路: 排个序 消元 完事~ 但是! 坑爹精度毁我人生 我hhhh他一脸 红红火火恍恍惚惚 //By SiriusRen #include <cmath> #include <cst ...

  5. Spark RDD概念学习系列之Pair RDD的action操作

    不多说,直接上干货! Pair RDD的action操作 所有基础RDD 支持的行动操作也都在pair RDD 上可用

  6. SQL Server 计算汉字笔画函数

    create function [dbo].[fun_getbh](@char nchar(2)) returns int as begin return( case when unicode(@ch ...

  7. jquery应用实例1:手风琴特效

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  8. .NET XML POST 请求

    //请求体,XML参数 string xmlstring = @"<root></root>“; //请求URL string postUrl ="http ...

  9. Error:Execution failed for task ':app:processDebugManifest'. 合并冲突

    1. Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attrib ...

  10. 『转』How to Think About Your Career

    开始工作的伊始,逐渐转载及阅读Medium上知名华裔设计师Julie Zhuo的文章,这是她在medium上的介绍:Product design VP @ Facebook. Lover of foo ...