避免奇数除数的奇数时间限制

时间:2018-10-05 12:16:41

标签: c++ time-limiting

问题集在比赛中: 给定一个范围[L,R],找出该范围内具有奇数个奇数除数的整数的数量。 ``例如,1只有一个除数,它是奇数,9有三个除数{1,3,9}并且它们都是奇数。同时,18具有六个除数{1,2,3,6,9,18},但其中三个是奇数。所以1、9和18的奇数除数是奇数。

输入 输入将以表示测试用例数量的正整数T(T≤10-5)开始。每个测试用例都有两个正整数L,R(1≤L≤R≤10-18),范围。

输出 对于每个测试用例,第一行都是“ Case t:x”格式的案例编号,不带引号。这里t是从1开始的案例数,x是落在[L,R]范围内并且具有奇数个奇数除数的整数的数量。

样品

Input   Output

3

1 3

5 10

10 15   


Case 1: 2

Case 2: 2

Case 3: 0

我编写的代码:

#include <bits/stdc++.h>
#include <cmath>
using namespace std;

int main()
{
    int T;
    cin>>T;

    for(int j=0; j<T; j++)
    {
        int m, nx;
        cin>>m>>nx;
        int finalCount = 0;

        for(int kk=m; kk<nx; kk++) // number
        {
            // Note that this loop runs till square root
            int oddCounter = 0;
            for (int i=1; i<=sqrt(kk); i++)
            {
                if (kk%i == 0)
                {
                    // If divisors are equal, print only one
                    if (kk/i == i)
                    {
                        if (kk & 1)
                            oddCounter++;
                    }
                    else // Otherwise print both
                    {
                        if (i & 1)
                            oddCounter++;
                        if ((kk/i) & 1)
                            oddCounter++;

                    }
                }
            }

            if ( oddCounter& 1)
                finalCount++;
        }

        cout<<"Case "<<j+1<<": "<<finalCount<<"\n";

    }

    //auto var_name = 0;
    //cout<<var_name<<"\n";

}

但是超过了时间限制。

CPU: 2s

Memory: 1500MB

如何改善我的代码? 有什么建议吗?

0 个答案:

没有答案