来源:牛客网
题目描述
牛牛现在有 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是有趣的。
输入描述:
一行一个整数nn表示牛牛现在有 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n这些数。
输出描述:
一个整数表示牛牛觉得有趣的三元组的个数。
示例1
输入
10
输出
9
大样例
输入
985554
输出
77766218
备注:
对于
20
%
20\%
20%的数据,
1
≤
n
≤
500
1 \leq n \leq 500
1≤n≤500
对于
40
%
40\%
40%的数据,
1
≤
n
≤
1
e
5
1 \leq n \leq 1e5
1≤n≤1e5
对于
100
%
100\%
100%的数据,
1
≤
n
≤
1
e
6
1 \leq n \leq 1e6
1≤n≤1e6
解题思路
提高组好难QAQ,十几个巨爷AK,本垃圾就水出了T1
确认B(枚举),A是B的因数,这只能暴力找B的因数个数了;C是B的倍数,这很好找, n / B n / B n/B就是C的可能个数
对于每一个B,它的有趣三元组的个数 = B的因数 * ( n / B n / B n/B)
Code
#include <iostream>
#include <cstdio>
using namespace std;
long long ans;
int n, f[1001000];
int main(){
scanf ("%d", &n);
for (int i = 1; i * 2 <= n; i++)//计算每个B的因数个数
for (int j = 2; j * i <= n; j++)
f[j * i]++;
for (int i = 2; i * 2 <= n; i++)
ans += f[i] * (n / i - 1);//公式
printf ("%lld", ans);
}