题意:
给出一个正整数n,求出不包含它本身的所有因子的和
思路:
运用算术基本定理对这个这个整数进行拆分
整数约数和公式即,sum = (1+p1+p1^2+...+p1^a1)(1+p2+p2^2+...p2^a2)...(1+pk+pk^2+...pk^ak)
(注:该公式计算结果包含整数本身)
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std ;
#define MAX 10000100
bool visit[MAX] ;
long long prime[MAX / 10] ;
int tot = 0 ;
void doprime()//素数筛
{
for(long long i = 2 ; i < MAX ; i ++)
{
if(! visit[i])
{
prime[tot ++] = i ;
for(long long j = i * i ; j < MAX ; j += i) visit[j] = true ;
}
}
}
int p[1000] ;//素因子
int a[1000] ;//素因子个数
int cnt ;
void sbreak(long long n)//素因子分解
{
memset(p , 0 , sizeof(p)) ;
memset(a , 0 , sizeof(a)) ;
cnt = 0 ;
for(int i = 0 ;prime[i] * prime[i] <= n ; i ++)
{
if(n % prime[i] == 0)
{
p[cnt] = prime[i] ;
while(n % prime[i] == 0)
{
a[cnt] ++ ;
n /= prime[i] ;
}
cnt ++ ;
}
}
if(n != 1)
{
p[cnt] = n ;
a[cnt ++ ] = 1 ;
}
}
int main()
{
int T ;
int num ;
doprime() ;
cin >> T ;
while(T --)
{
cin >> num ;
sbreak(num) ;
int ans = 1 ;
int temp , each ;
//求约数和
for(int i = 0 ; i < cnt ; i ++)
{
temp = 1 ;
each = 1 ;
for(int j = 1 ; j <= a[i] ; j ++)
{
each *= p[i] ;
temp += each ;
}
ans *= temp ;
}
cout << ans-num << endl ;
}
return 0 ;
}