首页 > 代码库 > HDU 1215

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;}

  

HDU 1215