PERFECT NUMBER PROBLEM(思维)

 题目链接:https://nanti.jisuanke.com/t/38220

题目大意:这道题让我们判断给定数字是否为完美数字,并给来完美数字的定义,就是一个整数等于除其自身之外的所有的因子之和。

首先打表前三个,发现满足 n = 1+2^1 + 2^2 + 2^3 + 2^z + (n/(2^1))+(n/(2^2))+...+n/(2^z).

然后化简这个式子,就是n=2^z*(2^z-1)。然后枚举z就可以了,看看有没有满足的。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn =2e5+100;
 6 const int mod = 1e9+7;
 7 ll qsm(ll t1,ll t2)
 8 {
 9     ll ans=1ll;
10     while(t2)
11     {
12         if(t2&1)
13             ans=ans*t1;
14         t1*=t1;
15         t2>>=1;
16     }
17     return  ans;
18 }
19 ll cal(ll t1)
20 {
21     ll ans=qsm(2,t1);
22     return ans*(ans*2-1);
23 }
24 bool judge(ll t)
25 {
26     ll tmp=cal(t);
27     ll sum=0;
28     for(int i=2; i<=(int)sqrt(tmp); i++)
29     {
30         if(tmp%i==0)
31         {
32             sum+=i;
33             sum+=tmp/i;
34         }
35     }
36     sum++;
37     return sum==tmp;
38 }
39 int main()
40 {
41     for(ll i=1; i<=20; i++)
42     {
43         if(judge(i))
44         {
45             cout<<i<<" "<<cal(i)<<endl;
46         }
47     }
48     return 0;
49 }

  

原文地址:https://www.cnblogs.com/letlifestop/p/10742737.html