目录
题目
问题描述
在蓝桥村长着一棵奇怪的菩提树,这棵树的分支数量和菩提果的数量总是形成奇数的因子对。
小蓝好奇,如何才能在指定的分支数量范围内,找出菩提果数量具有奇数个因子的分支数量。给定两个数字 AA 和 BB(AA 和 BB 表示豆荚树的分支数量的范围,A \leq BA≤B),你的任务是找出在这个范围内,豆荚数量具有奇数个因子的分支数量。
输入格式
输入的第一行包含两个整数 AA 和 BB,表示菩提树的分支数量的范围(1 \leq A \leq B \leq 10^{6}1≤A≤B≤106)。
输出格式
输出一行包含一个整数,表示在给定范围内,菩提果数量具有奇数个因子的分支数量。
样例输入
1 10
样例输出
3
样例解释
在这个范围内,分支数量为 1, 4, 9 的菩提果数量具有奇数个因子。
简单地说就是输入一个闭区间,求这个闭区间有几个数符合因子个数为奇数。
思路
- 完全平方数的因子个数为奇数。
-
可以用暴力求解法枚举出来,也可以用前缀和思想。
-
sqrt()的返回值是double。
题解
解法一:暴力求解
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int init = 0;
int last = 0;
cin >> init >> last;
int count = 0;
for(int i = init; i <= last; ++i)
{
if((int)sqrt(i)*(int)sqrt(i) == i)
{
++count;
}
}
cout << count << endl;
return 0;
}
解法二:前缀和(官方题解)
给一个区间[A,B],先算出[0,A-1]有几个完全平方数,再算[0,B]的完全平方数,最后用后者减去前者就可以得到[A,B]的完全平方数。
#include<bits/stdc++.h>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
cout << (int)sqrt(b) - (int)sqrt(a-1) << "\n";
return 0;
}