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