#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
今日推荐
周排行