赞
踩
牛牛现在有 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 是有趣的。
一行一个整数 n n n 表示牛牛现在有 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n 这些数。
一个整数表示牛牛觉得有趣的三元组的个数。
10
9
对于
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
这道题其实就是一道模拟。
其实我们就是要
x
×
a
=
b
x\times a=b
x×a=b 而且
y
×
b
=
c
y\times b=c
y×b=c。
(
x
,
y
x,y
x,y 为正整数)
那我们可以先普通枚举
a
a
a,然后直接从
a
+
a
a+a
a+a 开始枚举
a
a
a 的倍数作为
b
b
b,然后再从
b
+
b
b+b
b+b 开始枚举
b
b
b 的倍数作为
c
c
c。
那每一次枚举出来的
(
a
,
b
,
c
)
(a,b,c)
(a,b,c) 就是一对合法的三元组。
我是用三重循环扫过去,一次一次加的,很明显其实可以优化。
但是也可以过,我就懒得优化了。
#include<cstdio> #define ll long long using namespace std; int n; ll ans; int main() { scanf("%d", &n); for (int i = 1; i <= n / 4; i++)//枚举 a for (int j = i + i; j <= n / 2; j += i)//对于当前的 a 枚举合法的 b for (int k = j + j; k <= n; k += j)//对于当前的 b 枚举合法的 c ans++; printf("%lld", ans); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。