小G的sum
题目链接:nowcoder 218396
到牛客看:
题目大意
求 1~n 中每个数最小的约数和最大的约数的和。
思路
大家都知道,一个数最小的约数是 1 1 1,最大的约数是它自己。
那就是等于 ∑ i = 1 n ( 1 + i ) \sum\limits_{i=1}^{n}(1+i) i=1∑n(1+i),然后化简一下:
n + ( 1 + n ) × n / 2 = 2 × n / 2 + ( 1 + n ) × n / 2 = ( 3 + n ) × n / 2 n+(1+n)\times n/2=2\times n/2+(1+n)\times n/2=(3+n)\times n/2 n+(1+n)×n/2=2×n/2+(1+n)×n/2=(3+n)×n/2。
然后就可以 O ( 1 ) O(1) O(1) 求了。
代码
#include<cstdio>
using namespace std;
int n;
int main() {
scanf("%d", &n);
printf("%lld", 1ll * n * (n + 3) >> 1ll);
return 0;
}