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. 设置编码格式为utf8

    response.setCharacterEncoding("UTF-8"); 在Servlet2.3中是不行的,至少要2.4版本才可以,如果低于2.4版本,可以用如下办法: re ...

  2. HorizontalDragLayout-模仿QQclient的Item滑动删除

    首先感谢http://blog.csdn.net/lmj623565791/article/details/46858663hongyang的文章.之前看过ViewDragHelper类也读过一些de ...

  3. Spring经常使用属性的注入及属性编辑器

    对于对象的注入,我们使用ref方式,能够指定注入的对象.以下看下对于基本类型的注入.以及当spring无法转换基本类型进行注入时,怎样编写一个相似转换器的东西来完毕注入. 一.基本类型的注入 以下写一 ...

  4. code::blocks配置编译cuda并进行第一个demo的測试

    我们先新建个NVCC的编译器. 使用复制GCC编译器的方式进行新建,然后我们进行下面的路径配置 先来看看链接库,将我们常常使用的cuda库链接进来. 然后链接cuda的头文件: 接着配置调试工具以及编 ...

  5. linux含有某字符串的文件

    find .|xargs grep -ri "IBM" -l 只列出文件名:grep -rn "Item" * -l pattern files

  6. tensorflow利用预训练模型进行目标检测(一):安装tensorflow detection api

    一.tensorflow安装 首先系统中已经安装了两个版本的tensorflow,一个是通过keras安装的, 一个是按照官网教程https://www.tensorflow.org/install/ ...

  7. 杂项-DB:数据库

    ylbtech-杂项-DB:数据库   数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“数据库”是以一定方式储存在一起.能与 ...

  8. 26.QT颜色与布局

    dialog.h #ifndef PALETTE_H #define PALETTE_H #include <QDialog> #include <QComboBox> #in ...

  9. (转)IOS http请求的get 和 post的请求的区别

    从表面的意思看get 和 post的区别get就是获取数据,post就是发送数据.这个是误区.其实两者都可以的,在IOS向服务器发送请求里面可以带参数. 那么这些误区是怎么出现的呢?先看看一下对htt ...

  10. Api接口服务的设计和安全解决方案

    这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...