2020牛客寒假算法基础集训营2——E.做计数【推公式】

题目传送门


题目描述

这一天,牛牛与 牛魔王相遇了――然而这并不在 牛牛期望之中。
牛魔王不出意料又给 牛牛一道看似很难的题目:求有多少个不同的正整数三元组 ( i , j , k ) \text{}(i,j,k) (i,j,k) 满足 i + j = k \sqrt i+\sqrt j=\sqrt k i +j =k ,且 i × j ≤ n i\times j\leq n i×jn
牛牛并不会做,你能略施援手吗?
当两个三元组 ( i 1 , j 1 , k 1 ) , ( i 2 , j 2 , k 2 ) \text{}(i_1,j_1,k_1), (i_2,j_2,k_2) (i1,j1,k1),(i2,j2,k2) 满足 i 1 ≠ i 2 i_1\neq i_2 i1=i2 j 1 ≠ j 2 j_1\neq j_2 j1=j2 k 1 ≠ k 2 k_1\neq k_2 k1=k2 时它们被认为是不同的。


输入描述:

第一行,一个正整数 n。

保证 1 ≤ n ≤ 4 × 1 0 7 1\leq n\leq 4\times 10^7 1n4×107


输出描述:

输出一行,一个整数表示答案。


输入

1


输出

1


说明

(1,1,4)


题解

  • 两边平方,得 i + j + 2 i j = k i+j+2\sqrt{ij}=k i+j+2ij =k,显然仅当 i,ji,j 都是整数且 i j ij ij 为完全平方数时才会对应一个符合条件的 k k k

  • 枚举 [ 1 , n ] [1,n] [1,n]中所有的完全平方数(完全平方数可以表示为 x 2 x^2 x2,只需要枚举 x x x ),再枚举这个完全平方数的因数,统计答案。

  • O ( n ) O(\sqrt n) O(n ) 枚举完全平方数 O ( n ) O(\sqrt n) O(n ) 枚举因数,时间复杂度 O ( n ) O(n) O(n) ,可以进一步优化。


AC-Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
	int n;	cin >> n;	ll ans = 0;
	for (int i = 1; i * i <= n; ++i) {
		int num = 0;
		for (int j = 1; j <= i; ++j)
			if (i * i % j == 0)	ans += 2;
		--ans;
	}
	cout << ans << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值