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; }