1. 程式人生 > >Power oj 1790 :數論專題訓練F

Power oj 1790 :數論專題訓練F

Description

完全數是數論中常常出現的一個概念,他與麥森數的關係及其密切,目前人類已經發現了40多個完全數。毛哥認為,驗證一個數是否為完全數是一件非常容易的事情。所謂完全數就是一個數的所有小於它本身的因子之和就是這個數本身,比如說:6的因子是1、2、3 而且6=1+2+3,再比如說,28=1+2+4+7+14 現在WS的dreamone也覺得,驗證一個數是否為完全數是很容易的,所以他決定加大難度來考考毛哥。 Dreamone給毛哥一個數n,然後讓毛哥判斷,如果這個數的所有因子的和大於了n的話就輸出ABUNDANT,小於的話就輸出DEFICIENT,剛好等於(即n是完全數)的話輸出PERFECT 毛哥很快就寫出了程式,聰明的你也一定知道辦法吧~O(∩_∩)O~

Input

多組資料輸入,每一組資料輸入一個n(n不超過10^8)當n為0的時候結束輸入

Output

第一行輸出為:PERFECTION OUTPUT 對於每一個n,如果這個數的所有因子的和大於了n的話就輸出ABUNDANT,小於的話就輸出DEFICIENT,剛好等於(即n是完全數)的話輸出PERFECT 最後一行輸出:END OF OUTPUT

15 28 6 56 60000 22 496 0

PERFECTION OUTPUT 15 DEFICIENT 28 PERFECT 6 PERFECT 56 ABUNDANT 60000 ABUNDANT 22 DEFICIENT 496 PERFECT END OF OUTPUT

Hint

輸出格式為 printf("%5d PERFECT\n",N); printf("%5d ABUNDANT\n",N); printf("%5d DEFICIENT\n",N); %5d後面有兩個空格!! 建議直接複製這個hint

先打個素數表,把我們要求的數拆成素數的乘積

再根據尤拉完全數定理,sigema函式公式,求解    

  數論68頁69頁

#include<bits/stdc++.h>
using namespace std;
long long mod=1e9+7;
bool a[10000];
vector<long long>v;
vector<long long >::iterator it;
 
void init()
{
    for(long long i=2;i<=10000;i++)
    {
        a[i]=true;
    }
    for(long long i=2;i<=10000;i++)
    {
        if(a[i]==true)
        for(long long j=2;;j++)
        {
            if(i*j<=10000)
                a[i*j]=false;
            else
                break;
        }
    }
     for(long long  i=2;i<=10000;i++)
    {
        if(a[i]==true)
            v.push_back(i);
    }
   v.pop_back();
}
long long qpow(long long a,long long n)
{
    long long ans=1;
    long long base=a;
    while(n)
    {
        if(n&1)
            ans=ans*base%mod;
        base=base*base%mod;
        n>>=1;
    }
    return ans;
}
long long fun(long long  p,long long k)
{
    return (qpow(p,k+1)-1)/(p-1);
}
int main()
{
    long long  n;
    init();
   // printf("%d \n",v.size());
 
   printf("PERFECTION OUTPUT\n");
   while(cin>>n)
  {
      if(n==0)
        break;
        long long sum=1;
        long long pt=n;
      for(it=v.begin();it!=v.end();it++)
      {
          if((*it)*(*it)>n)
            break;
          long long k=0;
          while(n%(*it)==0)
          {
              n=n/(*it);
              k++;
          }
          if(k!=0)
          sum*=fun(*it,k);
      }
      if(n!=1)
     sum*=(n+1);
 
     sum=sum-pt;
     //printf("%lld\n",sum);
     if(sum==pt)
        printf("%5lld  PERFECT\n",pt);
      else if(sum>pt)
        printf("%5lld  ABUNDANT\n",pt);
      else
        printf("%5lld  DEFICIENT\n",pt);
 
  }
   printf("END OF OUTPUT\n");
 
    return 0;
}