HDOJ 5317 RGCDQ 水

预处理出每个数有多少个不同的因数,因数最多不超过7

RGCDQ

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 641    Accepted Submission(s): 304

Problem 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 maxGCD(F(i),F(j)) (L≤i<j≤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

/* ***********************************************
Author        :CKboss
Created Time  :2015年07月28日 星期二 21时27分27秒
File Name     :HDOJ5317.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int maxn=1000100;

int kut[maxn];
int num[10][maxn];
int ggd[10][10];

void init()
{
	for(int i=2;i<maxn;i++)
	{
		if(kut[i]==0)
		{
			for(int j=i;j<maxn;j+=i)
			{
				kut[j]++;
			}
		}
	}

	for(int i=2;i<maxn;i++)
	{
		num[kut[i]][i]++;
	}

	for(int j=2;j<maxn;j++)
	{
		for(int i=1;i<=7;i++)
		{
			num[i][j]=num[i][j]+num[i][j-1];
		}
	}

	for(int i=1;i<=10;i++)
	{
		for(int j=1;j<=10;j++)
		{
			if(ggd[i][j]==0)
			{
				ggd[i][j]=ggd[j][i]=__gcd(i,j);
			}
		}
	}
}

int L,R;
int nb[10];

int solve()
{
	if(L==R)
	{
		return kut[L];
	}

	for(int i=1;i<=7;i++)
		nb[i]=num[i][R]-num[i][L-1];

	int ans=0;
	for(int j=7;j>=1;j--)
	{
		if(nb[j]==0) continue;
		for(int i=7;i>=1;i--)
		{
			if(nb[i]==0) continue;
			if(j==i)
			{
				if(nb[j]>1) ans=max(ans,j);
			}
			else ans=max(ans,ggd[i][j]);
		}
	}

	return ans;
}

int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);

	init();

	int T_T;
	scanf("%d",&T_T);
	while(T_T--)
	{
		scanf("%d%d",&L,&R);
		int ans=solve();
		printf("%d\n",ans);
	}

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 00:32:05

HDOJ 5317 RGCDQ 水的相关文章

数学+dp HDOJ 5317 RGCDQ

题目传送门 1 /* 2 题意:给一个区间,问任意两个数的素数因子的GCD最大 3 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, 4 dp[r][j] - dp[l-1][j]表示区间内j的个数,情况不多,分类讨论一下 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <vecto

hdoj 5317 RGCDQ

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 1 #include<stdio.h> 2 3 const int MAXN = 1000010; 4 int F[MAXN]; 5 bool flag[MAXN]; 6 int S[8][MAXN]; 7 8 void init(){ 9 //对数据进行初始化 10 for(int i = 2; i <= MAXN ; ++i) 11 if(!flag[i]){ 12 F[i]++;

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

2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据量大, 所以必须做预处理.也就是用筛法求出全部的F[x],将全部F[x] 打印出来发现.事实上结果不大,最大的数值是7.所以对于每一个区间询问, 直接暴力求取有多少个 1 2 3 4 5 6 7 就可以,从大到小查找.假设出现2个以上 3-7 的数值,那么最大公约数就是该数字. 假设没有出现两个反复

HDU 5317 RGCDQ (合数分解+预处理)

题目链接:HDU 5317 RGCDQ 题意:定义函数F(x)为x的不同的素因子且小于等于x的个数,询问[l,r]区间中gcd(F(i),F(j))的最大值. 思路:暴力预处理出所有的合数分解结果,发现F(x)最大也只有7,之后就是暴力求出所有1到7出现次数的前缀和.询问的时候就打到O(1)了. AC代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #

hdu 5317 RGCDQ 筛法+线段树解法

RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 299    Accepted Submission(s): 151 Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and mor

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 Problem 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 (R

HDU 5317 RGCDQ

RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 323    Accepted Submission(s): 162 Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and mo

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) ),i.j在L,R区间内. 思路:因为2<=L < R<=1000000,所以他们的质因子最多的个数也就7个,也就是说1<=F(x)<=7,因为要求最大的GCD,所以只要知道在L,R区间内每个F(x)的情况就可以知道结果. 代码: 1 #include <stdio.h

hdu 5317 RGCDQ 多校 思维题

点击打开链接题目链接 RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 328    Accepted Submission(s): 164 Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find