请解释下面的解决方案或提供更好的解决方案

时间:2015-07-06 06:32:28

标签: c++ algorithm data-structures

数字游戏是一个给你两个整数(X和Y)的游戏,你必须打印X和Y之间的特殊数字。 特殊号码的属性如下: 特殊数字不能被任何数量的Z * Z形式整除,其中(Z> 1)。

输入: T,测试用例的数量。每个测试用例由两个空格分隔的整数组成,表示X和Y.

输出:每个测试用例在一行中所需的答案。

解决方案:

#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000000
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long int x,y,X,Y,i,j;
        scanf("%lld%lld",&x,&y);
        int arr[1000001]={0};
        for(i=2;i*i<=y;i++)
        {
            if(x%(i*i)!=0)
                X=x/(i*i)+1;
            else
                X=x/(i*i);
            Y=y/(i*i);
            for(j=X;j<=Y;j++)
                arr[i*i*j-x]=1;
        }
        long long int count=0;
        for(i=0;i<y-x+1;i++)
        if(!arr[i])
        count++;
        printf("%lld\n",count);
     }
}

请提供任何更好的解决上述问题或有人请解释上述解决方案谢谢

1 个答案:

答案 0 :(得分:1)

为什么不使用筛选算法并将所有数字标记为p^2 * X,其中p为素数。

然后在a[maxn]之类的数组中,在i

中写下特殊数字,最多为a[i]

每个x&amp; y a[y] - a[x-1]就是答案