阶乘分解质因子

分解质因子:求n的所有质因数

	for(int i=2;i*i<=x;++i){
		if(x%i==0){
			while(x%i==0) x/=i;
			num[++cnt]=i;
		}
	}

阶乘分解质因子:

比如求9!中质因子的个数:
2的个数=9/2+9/ ( 2 2 ) (2^2) +9/ ( 2 3 ) (2^3) =4+2+1=7
因为
  包含因子 2:2,4,6,8:fac[2]+=4(此时4和8仅记录第一个因子2)
  包含因子 2 2 2^2 :4,8:fac[2]+=2 (此时4和8记录了第二个因子2)
  包含因子 2 3 2^3 :8:fac[2]+=1 (此时8记录第三个因子2)
所以因子2的个数等于4+2+1=7;
同理:
因为
  包含因子 3:3,6,9:fac[3]+=3(此时9仅记录第一个因子3)
  包含因子 3 2 3^2 :9:fac[3]+=1 (此时9记录了第二个因子3)
所以因子3的个数等于9/3+9/ ( 3 2 ) (3^2) =3+1=4;

long long tmp=n;
long long k=0;
while(tmp){
	k+=tmp/num[i];
	tmp/=num[i];
}

C. Primes and Multiplication

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int num[100010];
long long POW(long long x,long long y){
	long long ans=1,tmp=x;
	while(y){
		if(y&1) ans=(ans*tmp)%mod;
		tmp=(tmp*tmp)%mod;
		y=y/2;
	}
	return ans;
}
int main(){
	long long x,n;
	scanf("%lld%lld",&x,&n);
	int cnt=0;
	for(int i=2;i*i<=x;++i){
		if(x%i==0){
			while(x%i==0) x/=i;
			num[++cnt]=i;
		}
	}
	
	if(x>1) num[++cnt]=x;
	long long ans=1;
	for(int i=1;i<=cnt;++i){
		long long tmp=n;
		long long k=0;
		while(tmp){
			k+=tmp/num[i];
			tmp/=num[i];
		}
		ans=(ans%mod*POW(num[i],k)%mod)%mod;
	}
	printf("%lld",ans);
	return 0;
}
发布了96 篇原创文章 · 获赞 11 · 访问量 2279

猜你喜欢

转载自blog.csdn.net/weixin_43769146/article/details/103265262