C++ [L,R]中具有奇数个奇数因子的数的个数
我这样做了,尽管我认为我有一个渐近最优的解决方案,但我仍然超过了时间限制。您需要注册一个帐户才能查看问题陈述并提交,因此我将在此重申: 给定一个范围[L,R],求该范围内具有奇数个奇数除数的整数数 约束条件为1q; 对于(inti=1;i>l>>r;C++ [L,R]中具有奇数个奇数因子的数的个数,c++,algorithm,C++,Algorithm,我这样做了,尽管我认为我有一个渐近最优的解决方案,但我仍然超过了时间限制。您需要注册一个帐户才能查看问题陈述并提交,因此我将在此重申: 给定一个范围[L,R],求该范围内具有奇数个奇数除数的整数数 约束条件为1q; 对于(inti=1;i>l>>r; cout好吧,诀窍是注意到这些数字要么是正方形,要么是2*square。(或者找到这些数字中的前几个并检查) 知道了这一点,我们可以很容易地计算出O(1)中间隔内的这些数字的数量,这样我们就可以回答O(Q)中的所有查询 首先,为了计算范围[L,R]
cout好吧,诀窍是注意到这些数字要么是正方形,要么是2*square。(或者找到这些数字中的前几个并检查) 知道了这一点,我们可以很容易地计算出O(1)中间隔内的这些数字的数量,这样我们就可以回答O(Q)中的所有查询
RSRT不是那么精确,所以我们可能需要为SRT计算添加一些+- 1 < /P> 示例代码(C++):
#包括
使用名称空间std;
#定义ll long long
llsolve(llx)
{
ll sq=sqrt(x)+2;
而(sq*sq>x)sq--;
ll sq2=sqrt(x/2)+2;
而(2*sq2*sq2>x)sq2--;
返回sq+sq2;
}
ll求解(ll l,ll r)
{
返回解算(r)-解算(l-1);
}
int main()
{
ios::与标准同步(0);cin.tie(0);cout.tie(0);
llq,l,r,cs=1;
cin>>q;
而(q--)
{
cin>>l>>r;
cout@Evg带[L,R]作为10^18我认为不太可能。也许我们可以重复使用平方根?但这真的很容易成为一个对抗性的例子,如果所有的查询都没有重叠并且都在10^17以上,那么为什么2
、4
和8
不是解决方案的一部分,因为它们也有奇数个奇数除数?@Wander3r你完全正确!16是解决方案的一部分这个问题已经被编辑好了,这一行是如何解释的res+=(sqrt(n)+1ll)/2ll
?我想不起来here@lincr它计算出O的个数,所以N已经被2除以了,我们取平方根,求出N下的平方数,然后我们提取奇数。
1 - (1)
2 - (1, 2)
4 - (1, 2, 4)
8 - (1, 2, 4, 8)
9 - (1, 3, 9)
16 - (1, 2, 4, 8, 16)
18 - (1, 2, 3, 6, 9, 18)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll solve(ll x)
{
ll sq = sqrt(x)+2;
while(sq*sq > x)sq--;
ll sq2 = sqrt(x/2)+2;
while(2*sq2*sq2 > x)sq2--;
return sq + sq2;
}
ll solve(ll l, ll r)
{
return solve(r) - solve(l-1);
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
ll q,l,r,cs=1;
cin>>q;
while(q--)
{
cin>>l>>r;
cout<<"Case "<<cs++<<": "<<solve(l,r)<<"\n";
}
}