C++ [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]

我这样做了,尽管我认为我有一个渐近最优的解决方案,但我仍然超过了时间限制。您需要注册一个帐户才能查看问题陈述并提交,因此我将在此重申:

给定一个范围[L,R],求该范围内具有奇数个奇数除数的整数数

约束条件为1q; 对于(inti=1;i>l>>r;
cout好吧,诀窍是注意到这些数字要么是正方形,要么是2*square。(或者找到这些数字中的前几个并检查)

知道了这一点,我们可以很容易地计算出O(1)中间隔内的这些数字的数量,这样我们就可以回答O(Q)中的所有查询

  • 首先,为了计算范围[L,R],我们可以计算范围[0,R]-[0,L-1]

  • 对于某些范围[0,X],我们可以注意到在这个区间有sqrt(X)个正方形

  • 类似于双正方形,大约有sqrt(X/2)这样的数字

  • 对于C++中的大数,LI>

    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";
        }
    }