CF893E Counting Arrays 组合计数

这个还是比较简单的.  

将 $x$ 质因数分解,然后依次考虑每个质因子的贡献就行了,贡献是一个组合.  

code:

#include <cstdio> 
#include <algorithm>         
#define N 2000006 
#define ll long long 
#define mod 1000000007 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
int tot;           
int vis[N],prime[N],inv[N],fac[N],low[N];  
int qpow(int x,int y) 
{
    int tmp=1; 
    for(;y;y>>=1,x=1ll*x*x%mod) 
        if(y&1) tmp=1ll*tmp*x%mod;  
    return tmp;  
}
void init() 
{ 
    for(int i=2;i<N;++i) 
    {
        if(!vis[i]) prime[++tot]=i,low[i]=i;  
        for(int j=1;j<=tot&&prime[j]*i<N;++j) 
        {
            vis[i*prime[j]]=1,low[i*prime[j]]=prime[j]; 
            if(i%prime[j]==0) break;  
        }
    }
}
int C(int x,int y) { if(x<y) return 0; return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod; }  
int main() 
{ 
    // setIO("input");  
    int i,j,q; 
    scanf("%d",&q); 
    init();  
    inv[0]=fac[0]=1;  
    for(i=1;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod, inv[i]=qpow(fac[i],mod-2);  
    for(i=1;i<=q;++i) 
    {    
        int x,y,ans=1;  
        scanf("%d%d",&x,&y);                 
        while(x!=1) 
        {
            int p=low[x],cnt=0;   
            while(low[x]==p) x/=p,++cnt;        
            ans=1ll*ans*C(y+cnt-1,cnt)%mod;          
        }    
        ans=1ll*ans*qpow(2,y-1)%mod;   
        printf("%d\n",ans);  
    }
    return 0; 
}

  

posted @ 2020-01-10 14:31  EM-LGH  阅读(165)  评论(0编辑  收藏  举报