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