Counting Arrays CF893E

发布时间 2023-03-28 14:47:02作者: towboat

给出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();
 	
 }