HDU 4390 Number Sequence (容斥原理+组合计数)
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 (容斥原理+组合计数)的更多相关文章
- HDU 4390 Number Sequence 容斥原理
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 1005 Number Sequence(数论)
HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...
- HDU 1711 Number Sequence (字符串匹配,KMP算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1711 Number Sequence (KMP简单题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- BA-siemens-insight报警设置
以0007001(DDC-B3-09)为例,介绍insight报警的设置方法:
- HDOJ 3339 In Action
最短路+01背包 In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- leetCode(32):Power of Two
Given an integer, write a function to determine if it is a power of two. 2的幂的二进制表示中,必定仅仅有一个"1&q ...
- ACM-SG函数之Fibonacci again and again——hdu1848
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- inconsistent line endings 解决方法
I'm using Unity 3D in combination with Visual Studio 2008 on a Windows 7 64 bit system. When savi ...
- 一个操作oracle的c#类 含分页
有别于以前的一个OracleHelper,这个版各有所长,MARK下. using System; using System.Data; using System.Data.OracleClient; ...
- PySide2运行出错问题解决
PySide2是QT官方出的Python的QT封装, 不过默认安装运行时候会有一些小问题, 可能是系统里已经安装过其他版本QT的原因, 会报错如下: PySide2 qt.qpa.plugin: Co ...
- POJ 2392 DP
题目大意:有一头奶牛要上太空,他有很多种石头,每种石头的高度是hi,但是不能放到ai之上的高度,并且这种石头有ci个 将这些石头叠加起来,问能够达到的最高高度. 题意转载自:http://blog.c ...
- DirectUI界面编程(二)绘制一个按钮
上节介绍了使用源码方式构建Duilib应用的项目配置,并创建了一个最简单的基于Duilib库的窗口,细心的读者会发现,当我们点击窗口的关闭按钮时,应用并没有真的退出,因为我们并没有对窗口事件进行处理, ...
- listview添加的头部布局超过一屏头部内容显示不全
headView的实际高度超过一个屏幕,但是显示的结果只有一个屏幕,超过一个屏幕高度意外的部分显示不全. 只使用了listView.getRefreshable().addHeadView(headV ...