HDU 1215

由算术基本定理,

直接使用公式就好

#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\n",ans-tn);
	}
	return 0;
}

  

posted @ 2014-08-29 10:11  chenjunjie1994  阅读(156)  评论(0编辑  收藏  举报