唯一分解定理+因子个数+因子和

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <list>
#include <bitset>
#include <climits>
#define lowbit(x) (x & -x)
#define gcd(a, b) __gcd(a, b)
#define mset(a, x) memset(a, x, sizeof(a))
#define FIN freopen("input", "r", stdin)
#define FOUT freopen("output", "w", stdout)
const int INF = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-6;
const int MAX = 1e5 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
using namespace std;
inline ll lcm(ll a, ll b){return a / gcd(a, b) * b; }
inline ll qpow(ll a, ll b){ll r = 1, t = a; while(b){if(b & 1) r = (r * t) % mod; b >>= 1; t = (t * t) % mod; } return r; }
inline ll inv1(ll b){return qpow(b, mod - 2); }
inline ll inv2(ll b){return b == 1 ? 1 : (mod - mod / b) * inv2(mod % b) % mod; }
inline ll exgcd(ll a, ll b, ll &x, ll &y) {if(!b){x = 1; y = 0; return a; }ll r = exgcd(b, a % b, y, x); y -= (a / b) * x; return r; } 
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0 };
ll n;

int k = 0;
struct Factor{//存分解后的素因子和该素因子个数 
	ll factor, Count;
	Factor(){
		Count = 0;
	}
}fa[100005];
void decompose(ll x){//唯一分解定理 
	ll ans = 0;
	for(ll i = 2; i * i <= x; i++){
		if(x % i == 0){
			fa[k].factor = i;
			while(x % i == 0){
				x /= i;
				fa[k].Count++;
			}
			k++;
		}
	}
	if(x > 1){
		fa[k].factor = x;
		fa[k].Count = 1;
		k++;
	}
}


ll dcpCount(ll x){//所有因子的个数(包括1) 
	ll ans = 1;
	for(ll i = 2; i * i <= x; i++){
		if(x % i == 0){
			ll temp = 0;
			while(x % i == 0){
				x /= i;
				temp++;
			}
			ans *= (temp+1);
		}
	}
	if(x > 1) ans *= 2;
	return ans;
}


ll dcpSum(ll x){//所有因子的和(包括1)
	ll ans = 1;
	for(ll i = 2; i * i <= x; i++){
		if(x % i == 0){
			ll temp = 1;
			while(x % i == 0){
				x /= i;
				temp *= i;
			}
			ans *= (temp * i - 1) / (i - 1);
		}
	}
	if(x > 1) ans *= (1 + x);
	return ans;
}

int main ()
{
	while(scanf("%lld", &n)!=EOF){
		ll temp=1;
		memset(fa,0,sizeof(fa));
		k=0;
		decompose(n);
		for(int i = 0; i < k; i++){
			if(i) printf(" * ");
			printf("%lld^%lld", fa[i].factor, fa[i].Count);
			temp *= qpow(fa[i].factor, fa[i].Count);
		}
		printf(" = %lld\n", temp);
		printf("因子和: %lld\n", dcpSum(n));
		printf("因子个数: %lld\n", dcpCount(n));
	}
    return 0;
}



猜你喜欢

转载自blog.csdn.net/sxh759151483/article/details/80137459