HDU 4390 Number Sequence ---容斥原理

来源:互联网 发布:外链网盘源码 编辑:程序博客网 时间:2024/06/06 23:18

先对每个数 质数分解。

假如有m个质因子,每个质因子有ai个;n个数

然后容斥原理。。

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>using namespace std;#define inf 0x3f3f3f3f#define ll __int64ll a[20],b[2000],cc[20],d[2000];ll c[50][50];ll mod=1e9+7;int t;ll C(ll n,ll k)  {      if(c[n][k]!=-1) return c[n][k];      if(k==1) return c[n][k]=n;      if(k==0) return c[n][k]=1;      if(n==k) return 1;      if(k > (n>>1)) return c[n][k]=C(n,n-k);      return c[n][k]=(C(n-1,k-1)+C(n-1,k))%mod;  } ll calc(ll n,ll m,ll k){ll ans=1,i;for(i=0;i<t;i++){ll t=C(n+d[i],n);ans=(ans*t)%mod;}ans=(ans*C(m,k))%mod;return ans;}int main(){ll n;memset(c,-1,sizeof(c));while(cin>>n){ll i,j,k,cnt=0;memset(b,0,sizeof(b));memset(cc,0,sizeof(cc));for(i=0;i<n;i++){cin>>k;for(j=2;j*j<=k;j++){if(k%j==0){while(k%j==0){b[j]++;k/=j;}}}if(k!=1){if(k<=1000) b[k]++;else{int flag=0;for(j=0;j<cnt;j++)if(k==a[j]){cc[j]++;flag=1;}if(flag==0){a[cnt]=k;cc[cnt]++;cnt++;}}}}t=0;for(i=2;i<=1002;i++){if(b[i])d[t++]=b[i];}for(i=0;i<cnt;i++)d[t++]=cc[i];ll res=0;for(i=0;i<n;i++){if(i%2==0)res=(res+calc(n-1-i,n,i))%mod;elseres=(res+mod-calc(n-1-i,n,i))%mod;}cout<<res<<endl;}}


0 0
原创粉丝点击