最大的奇约数和
https://blog.csdn.net/wangchao7281/article/details/52740793 题意 以及 3 种做法
总体思路:
因为奇数的最大奇数约数就是自己啊,对于偶数我们只能一直除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 }