组合数学——cf893E

/*
不定方程 x1+...+xy=c 的正整数解有C(y+c-1,y-1)个
质因子分解后每种因子都独立算贡献,再相乘
最后因为可以随意加偶数个-1,所以再乘2^y-1 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define mod 1000000007
#define N 1000006

ll F[N],invf[N],inv[N],p2[N];
int vis[1000005],prime[1000005],m;
void init(){
    for(int i=2;i<=1000000;i++){
        if(!vis[i])
            prime[++m]=i;
        for(int j=1;j<=m;j++){
            if(prime[j]*i>=1000000)break;
            vis[prime[j]*i]=1;
            if(i%prime[j])break;
        }
    }
}

int mm,p[50],c[50];
void divide(int x){
    memset(c,0,sizeof c);
    mm=0;
    for(int i=1;prime[i]*prime[i]<=m;i++)
        if(x%prime[i]==0){
            p[++mm]=prime[i];
            while(x%prime[i]==0)
                x/=prime[i],c[mm]++;            
        }
    if(x>1){
        p[++mm]=x;
        c[mm]=1;
    }
}
inline ll C(ll a,ll b){
    if(a<b)return 0;
    return F[a]*invf[b]%mod*invf[a-b]%mod;
} 

int x,y,q;
int main(){
    init();
    F[0]=1;invf[0]=1;inv[1]=1;p2[0]=1;
    for(int i=2;i<=1000000;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for(int i=1;i<=1000000;i++)F[i]=F[i-1]*i%mod;
    for(int i=1;i<=1000000;i++)invf[i]=invf[i-1]*inv[i]%mod;
    for(int i=1;i<=1000000;i++)p2[i]=p2[i-1]*2%mod;
    
    cin>>q;
    while(q--){
        cin>>x>>y;
        divide(x);
        ll res=1; 
        for(int i=1;i<=mm;i++){
            //因子p[i]的贡献
            res=res*C(y+c[i]-1,y-1)%mod;
        }
        res=res*p2[y-1]%mod; 
        cout<<res<<'\n';
    }
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12296969.html