给出x和y,求一个长度为y的序列,其乘积为x,允许有负数,求这种序列的个数,
x分解质因数,考虑每个 p^e, 把e分为y 份( 可以为0),个数为 C( e+y-1,e)
这题需要乘法逆元 来进行乘法
#include <iostream> #include <cstring> #include <queue> using namespace std ; const int N =1e6+100; #define int long long const int mod =1e9+7; int m,n,fac[N],fnv[N],Pow[N]; int ksm(int x,int y){ if(y==0) return 1; int t= ksm(x,y/2) ; if(y&1) return ((t*t%mod)*x)%mod; return t*t%mod; } int inv(int x){ return ksm(x,mod-2)%mod ; } int C(int x,int y){ return (((fac[x]*fnv[y])%mod)*fnv[x-y])%mod; } int cal(int x){ return C(x+n-1,x); } void split(int x){ int ans=Pow[n-1];ans%=mod; for(int i=2;i*i<=x;i++){ if(x%i==0){ int t=0; while(x%i==0) t++,x/=i; ans*=cal(t),ans%=mod; } } if(x>1){ ans*=cal(1); ans%=mod; } cout<<ans<<endl; } void solve(){ cin>>m>>n; split(m); } signed main(){ Pow[0]=fac[0]=fnv[0]=1; for(int i=1;i<=1e6+98;i++) { fac[i]=fac[i-1]*i,fac[i]%=mod, Pow[i]=Pow[i-1]*2,Pow[i]%=mod, fnv[i]=inv(fac[i]),fnv[i]%=mod; } int tes;cin>>tes; while(tes--) solve(); }