Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and more interesting things about GCD. Today He comes up with Range Greatest Common Divisor Query (RGCDQ). What’s RGCDQ? Please let me explain it to you gradually. For a positive integer x, F(x) indicates the number of kind of prime factor of x. For example F(2)=1. F(10)=2, because 10=2*5. F(12)=2, because 12=2*2*3, there are two kinds of prime factor. For each query, we will get an interval [L, R], Hdu wants to know \max GCD(F(i),F(j)) (L\leq i<j\leq R)
 

Input

There are multiple queries. In the first line of the input file there is an integer T indicates the number of queries. 
In the next T lines, each line contains L, R which is mentioned above.

All input items are integers. 
1<= T <= 1000000 
2<=L < R<=1000000 

 

Output

For each query,output the answer in a single line. 
See the sample for more details. 
 

Sample Input

2
2 3
3 5
 

Sample Output

1
1
 

Source

2015 Multi-University Training Contest 3
题意:如题,x是一个正整数,f(x)表示x的素因子种类数, F(2)=1. F(10)=2,因为10=2*5. F(12)=2, 因为12=2*2*3。现在给定两个数l和r,问在l和r这个区间内任取两个数i,j中gcd(f(i),f(j))的最大值。给定t组数据,每组给定l和r,输出结果。
题解:先用素筛法打表筛选出每个数的素因子种类数,我们发现2*3*5*7*11*13*17=510510,注意虽然这个数小于10的6次方,但是已经足够证明7已经是最大值了,因为这7个素数是素数中最小的7个。f(i)只考虑i的素因子种类个数,不考虑这个素因子是否和j的素因子是同一个。举个例子,比如i=2*3*5*7*11*13*17=510510,种类数为7,j=2*3*5*7*11*13*19=570570,种类数也为7,所以如果lr区间中包含ij那么输出7。事实上,510510和570570是最小的两个包含7种素因子的数。说到这里就可以写了,涉及到一点递推的知识,用sum[maxn][8]存储,sum[i][j]表示对于数i来说,2到i中所有数的素因子种类数为j的数的个数。i从7遍历到1,如果sum[r][i]-sum[l-1][i]>=2,说明该区间内存在至少两个数的素因子种类数为i,break输出即可,因为我们要的是最大值。注意初始的时候要把ans定义为1,因为可能所有数的素因子种类数都不相等比如6,7这组数据,f(6)=2,f(7)=1,gcd(2,1)=1。输出1而不是0,虽然输出0也是能AC的但是不符合题意。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=1e6+;
int num[maxn];
int sum[maxn][];
void getnum()
{
memset(num,,sizeof(num));
memset(sum,,sizeof(sum));
for(int i=;i<maxn;i++)
{
if(!num[i])
{
for(int j=i;j<maxn;j+=i)
num[j]++;
}
}
for(int i=;i<maxn;i++)
for(int x=;x<=;x++)
{
sum[i][x]=sum[i-][x];
if(num[i]==x)
sum[i][x]++;
}
}
int main()
{
getnum();
int t;
scanf("%d",&t);
while(t--)
{
int l,r,ans=;
scanf("%d%d",&l,&r);
for(int i=;i>=;i--)
{
if(sum[r][i]-sum[l-][i]>=)
{
ans=i;
break;
}
}
printf("%d\n",ans);
}
return ;
}

HDU 5317 RGCDQ (数论素筛)的更多相关文章

  1. hdu 5317 RGCDQ(前缀和)

    题目链接:hdu 5317 这题看数据量就知道需要先预处理,然后对每个询问都需要在 O(logn) 以下的复杂度求出,由数学规律可以推出 1 <= F(x) <= 7,所以对每组(L, R ...

  2. ACM学习历程—HDU 5317 RGCDQ (数论)

    Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more an ...

  3. HDU 5317 RGCDQ(素数个数 多校2015啊)

    题目链接:pid=5317" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=5317 Prob ...

  4. hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...

  5. 2015 Multi-University Training Contest 3 hdu 5317 RGCDQ

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. HDU 5317 RGCDQ

    题意:f(i)表示i的质因子个数,给l和r,问在这一区间内f(i)之间任意两个数最大的最大公倍数是多少. 解法:先用筛法筛素数,在这个过程中计算f(i),因为f(i)不会超过7,所以用一个二维数组统计 ...

  7. HDU 5317 RGCDQ (质数筛法,序列)

    题意:从1~1000,000的每个自然数质因子分解,不同因子的个数作为其f 值,比如12=2*2*3,则f(12)=2.将100万个数转成他们的f值后变成新的序列seq.接下来T个例子,每个例子一个询 ...

  8. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  9. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. Prim和Kruskal求最小生成树

    Prim: 算法步骤: 1.任意结点开始(不妨设为v1)构造最小生成树: 2.首先把这个结点(出发点)包括进生成树里, 3.然后在那些其一个端点已在生成树里.另一端点还未在生成树里的所有边中找出权最小 ...

  2. Opencv不用每次创建项目配置vs2010 vc++目录 库目录等项

    可以设置成编译器的环境配置,VS2010相对其他版本虽然去掉了编译器配置 但可以通过属性管理器配置编译器环境. 设置对应的vc++目录 链接器就可以了,这样就是对整个编译器配置了 下次就不用再配了.

  3. Spring AOP中定义切点(PointCut)和通知(Advice)

    如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...

  4. 创建,增加,删除mysql表分区

    1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles (     emp_no      INT NOT NULL,     titl ...

  5. tomcat管理员配置

    纸上得来终觉浅,绝知此事要躬行 博客园 首页 新闻 新随笔 联系 管理 随笔- 458  文章- 0  评论- 38  Tomcat的Manager显示403 Access Denied   管理to ...

  6. C++命名空间

    C++命名空间 本讲基本要求 * 掌握:命名空间的作用及定义:如何使用命名空间.     * 了解:使用早期的函数库 重点.难点     ◆命名空间的作用及定义:如何使用命名空间.     在学习本书 ...

  7. apt-get常用命令

    apt-get常用命令 一,什么的是apt-get 高级包装工具(英语:Advanced Packaging Tools,简称:APT)是Debian及其衍生发行版(如:ubuntu)的软件包管理器. ...

  8. 关于31天App教程示例中一些因SDK版本而出现的问题(转)

    由于国外那个知名的31天案例教程比较老,所用官方API是2008年时的2.X,所以在现在的Xcode3-4之后或多或少都有编译警告和错误信息.必须做些适应iOS版本的代码更改才能顺利编译通过. Day ...

  9. firefox访问失败的时间设置错误问题

    在新装系统, 安装firefox后, 访问网页: baidu时 总是自动将http转换为https, 这个是baidu服务器的设置问题, 怪不到ff bd说,是ocsp证书错误, 然后将ocsp认证q ...

  10. javascript将毫秒转换成hh:mm:ss的形式

    function formatMilliseconds(value) { var second = parseInt(value) / 1000; // second var minute = 0; ...