hdu 4390 Number Sequence
2016-07-20 17:11
471 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4390题目大意:
给一些数,求出这些数的乘积,再把这个积分解成n个大于一的因子,问有多少种情况。解题思路:
没想到,看了别人的。别人的思路是统计这每个质因子的对于n个数出现的次数。再用容斥定理求出结果。把每个质因子分到n个数中是总的情况,再减去n个数中至少有一个数没有分到质因子的情况,就是每个数都分到质因子的情况即该数不为一的情况。代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<map> #define LL long long using namespace std; const int mod=1000000007; int seq[30]; bool isprime[1010]; int prime[1010],cnt; int C[430][430]; void init(){ memset(isprime,1,sizeof isprime); isprime[0]=isprime[1]=false; cnt=0; for(int i=2;i<=1000;++i){ if(isprime[i]){ prime[cnt++]=i; for(int j=i*i;j<=1000;j+=i) isprime[j]=false; } } C[0][0]=1; for(int i=1;i<=420;++i){ C[i][0]=C[i][i]=1; for(int j=1;j<i;++j) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } } int main(){ int n; init(); while(~scanf("%d",&n)){ for(int i=0;i<n;++i) scanf("%d",seq+i); map<int,int> numFac; for(int i=0;i<n;++i){ for(int j=0;j<cnt&&prime[j]*prime[j]<=seq[i];++j){ if(seq[i]%prime[j]==0){ while(seq[i]%prime[j]==0){ numFac[prime[j]]+=1; seq[i]/=prime[j]; } } } if(seq[i]>1) numFac[seq[i]]+=1; } LL ans=0; for(int i=0;i<n;++i){ LL tmp=C [i]; map<int,int>::iterator it; for(it=numFac.begin();it!=numFac.end();++it) tmp=tmp*C[it->second+n-i-1][it->second]%mod; ans=(ans+(i&1?-tmp:tmp))%mod; } printf("%I64d\n",(ans+mod)%mod); } return 0; }
总结:
相关文章推荐
- UIView点击事件。弹出视图,背景虚化。
- Ring3下Hook NtQueryDirectoryFile隐藏文件
- Media Queries
- [YY题]HDOJ5288 OO’s Sequence
- leetcode 375. Guess Number Higher or Lower II
- Android 开发最佳实践教程——MVPBuilder
- 自定义可动画展开收缩View的实现
- UICollectionView详解
- 40.You have statistics collected for some selected tables. Your requirement is that the statistics
- 让超出父视图范围的子视图响应事件,在UIView范围外响应点击
- uvaLive 3263 That Nice Euler Circuit 欧拉定理
- UIBezierPath
- 自定义View之MenuItemView
- 判断UitableView reloadData 结束的方法
- GStreamer SDK 1.0 Build Via Cerbero
- java -BolokingQueue
- button的常用属性和方法总结
- Leetcode 232. Implement Queue using Stacks (Easy) (cpp)
- UIPickerView
- 关于去除easy ui 的input textarea 等输入框点击有蓝色框框