最大的奇约数和

 

 

https://blog.csdn.net/wangchao7281/article/details/52740793  题意 以及 3 种做法

 

https://www.nowcoder.com/practice/49cb3d0b28954deca7565b8db92c5296?tpId=85&&tqId=29855&rp=5&ru=/activity/oj&qru=/ta/2017test/question-ranking 牛客题目

 


总体思路:
因为奇数的最大奇数约数就是自己啊,对于偶数我们只能一直除2直到得到一个奇数即为最大奇数约数

比如1 2 3 4 5 6 7 8 9 10
即n=10 ,此时奇数有1 3 5 7 9 我们把这几个奇数相加然后n/2
得到第二轮序列序列 1 2 3 4 5 分别对应上次的2 4 6 8 10 五个偶数,这是我们再加1 3 5
依次类推

细节问题:
当n为偶数,就有n/2个奇数,根据等差数列求和公式 即((首项+末项)*项数)/2,我们知道n/2个奇数和为((1+n-1)*n/2)/2,
即为(n/2) * (n/2),此时n为偶数,因此 (n/2) * (n/2) = ((n+1)/2) * ((n+1)/2)

当n为奇数,有(n+1)/2个奇数,此时奇数和为((n+1)/2) * ((n+1)/2)
因此两种情况可以用一个等式来总结

 

第一种o(n)做法过了60%样例。

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9 #include<set>
10 #include<vector>
11 #include<stack>
12 #include<queue>
13 #include<map>
14 using namespace std;
15 #define ll long long
16 #define mem(a,x) memset(a,x,sizeof(a))
17 #define se second
18 #define fi first
19 const int INF= 0x3f3f3f3f;
20 const int N=1e7+5;
21 
22 ll n; //n必须也为ll类型
23 ll sum=0;
24 
25 int main()
26 {
27     cin>>n;
28     while(n)
29     {
30         sum+= ( (n+1)/2 )*( (n+1)/2 );
31         n/=2;
32     }
33     cout<<sum;
34 }

 

posted @ 2018-07-23 10:07  木流牛马  阅读(302)  评论(0编辑  收藏  举报