nowcoder 2020牛客NOIP赛前集训营-提高组(第五场)T1 三元组计数
Description–
牛牛现在有 n n n个数分别是 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n,牛牛特别喜欢数三元组,如果三个数 a , b , c a,b,c a,b,c满足 b b b是 a a a的倍数, c c c是 b b b的倍数,那么牛牛就觉得这三个数形成的三元组是有趣的。
现在给定 n n n的大小,牛牛想知道有多少个三元组 ( a , b , c ) , a < b < c (a, b, c),a < b < c (a,b,c),a<b<c是有趣的。
Input–
一行一个整数nn表示牛牛现在有 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n这些数。
Output–
一个整数表示牛牛觉得有趣的三元组的个数。
Sample Input–
10
Sample Output–
9
说明–
对于
20
%
20\%
20%的数据,
1
≤
n
≤
500
1 \leq n \leq 500
1≤n≤500
对于
40
%
40\%
40%的数据,
1
≤
n
≤
1
0
5
1 \leq n \leq 10^5
1≤n≤105
对于
100
%
100\%
100%的数据,
1
≤
n
≤
1
0
6
1 \leq n \leq 10^6
1≤n≤106
代码–
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll ans, d[1000006];
int n, f, pd[1000006];
int main()
{
scanf("%d", &n);
for (int i = 2; i <= n / 2; ++i)
for (int j = 2; j * i <= n; ++j)
pd[i * j]++; //累计每个数的因数个数
for (int i = 4; i <= n; ++i)
d[i] = d[i - 1] + pd[i]; //d[i]表示某个在n以内有i个倍数的数为三元组个数的贡献
for (int i = 1; i <= n; ++i)
{
f = n / i; //f表示对于每个i,n以内的倍数个数
ans += d[f];
}
printf("%lld", ans);
return 0;
}