階乘的分解質因數

首先說一下分解質因數:

唯一分解定理:任何一個數都可以唯一分解爲幾個質數的冪次乘積。

const int maxn = 1e6+5;
int p[maxn], c[maxn];
int cnt = 0;
void divided(int n){
	for(int i = 2; i * i <= n; i++){
		if(n % i == 0){
			p[++cnt] = i; c[cnt] = 0;
			while(n % i == 0) n /= i, c[cnt]++; 
		}
	}
	if(n > 1) p[++cnt] = n, c[cnt] = 1;
}

階乘的因式分解:

求1~n之內的數,因子爲2的個數,即是求n!這個數中因子爲2的個數

int sum = 0;

while(n){

        sum += n/2;

        n /= 2;

}

ull fun(ull n, ull x){
	ull res = 0;
	while(n){
		res += n / x;
		n /= x;
	}
	return res;
}

 

 

例題:codeforcesC. Primes and Multiplication

 

直接分解x,得到唯一分解,然後求每個因子在1~n中出現的次數(使用階乘的因式分解),然後用快速冪求解。

#include<bits/stdc++.h>

using namespace std;
typedef unsigned long long ull;
const ull mod = 1e9+7; 

const int maxn = 1e6+5;
ull p[maxn], c[maxn];
int cnt = 0; 

void divided(ull n){
	for(ull i = 2; i * i <= n; i++){
		if(n % i == 0){
			p[++cnt] = i; c[cnt] = 0;
			while(n % i == 0) n /= i, c[cnt]++;
		}
	}
	if(n > 1) p[++cnt] = n, c[cnt] = 1;
}

ull fun(ull n, ull x){
	ull res = 0;
	while(n){
		res += n / x;
		n /= x;
	}
	return res;
}

ull quick_mod(ull x, ull n){
	ull res = 1;
	while(n > 0){
		if(n & 1) res = res * x % mod;
		x = x * x % mod;
		n >>= 1;
	}
	return res;
}

int main()
{
	ull x, n;
	scanf("%llu%llu", &x, &n);
	divided(x);
	ull ans = 1;
	for(int i = 1; i <= cnt; i++){
		ull pp = p[i];
		ull num = fun(n, pp);
		ans *= quick_mod(pp, num);
		//printf("%llu %llu\n", pp, num);
		ans %= mod;
	}
	printf("%llu\n", ans);
	return 0;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章