由算术基本定理,
直接使用公式就好
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Maxp=1000;
bool isprime[Maxp];
int prime[Maxp],nprime;
void Doprime(){
memset(isprime,true,sizeof(isprime));
nprime=0;
isprime[1]=false;
for(int i=2;i<Maxp;i++){
if(isprime[i]){
prime[nprime++]=i;
for(int j=i*i;j<Maxp;j+=i){
isprime[j]=false;
}
}
}
}
int main(){
Doprime();
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int tn=n;
int ans=1;
for(int i=0;i<nprime&&prime[i]<=n;i++){
int tmp=1;
if(n%prime[i]==0){
while(n%prime[i]==0){
n/=prime[i];
tmp*=prime[i];
}
ans=ans*(tmp*prime[i]-1)/(prime[i]-1);
}
}
// cout<<n<<endl;
if(n!=1)
ans=ans*(n+1);
printf("%d
",ans-tn);
}
return 0;
}