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 }