HDU 5317 RGCDQ (质数筛法,序列)
题意:从1~1000,000的每个自然数质因子分解,不同因子的个数作为其f 值,比如12=2*2*3,则f(12)=2。将100万个数转成他们的f值后变成新的序列seq。接下来T个例子,每个例子一个询问区间seq[L,R]。问该子序列中任意两个不同下标的数,他们的GCD值最大为多少?
思路:
(1)质因子分解,用筛法先将质数先全部出来。
(2)对每个自然数求其f值,即将其质因子分解后的不同因子个数,作为seq序列。
(3)扫一遍seq,用另一个数组记录下标i之前有多少个1、2、3、4...。因为seq序列中最大的数不超过10,所以可以统计,以方便能在O(1)内得到一个区间内有多少个值为x的元素。
(4)对于每个询问L和R,将所有元素装入新的序列中,准备求GCD。注意:相同数字不必超过2个,即新序列中的元素顶多出现2次。
#include <bits/stdc++.h>
using namespace std;
const int N=;
vector<int> prime;
bool seq[N];
int cnt[N];
int fval[N][]; void pre_cal()
{
memset(seq,,sizeof(seq));
memset(cnt,,sizeof(cnt));
memset(fval,,sizeof(fval)); for(int i=; i*i<N; i++) //所有质数都是false;
{
if(!seq[i]) continue;
for(int j=i*i; j<N; j+=i) seq[j]=;
} for(int i=; i<N; i++) if(seq[i]) prime.push_back(i); for(int i=; i<N; i++) //求f值
{
int t=i;
for(int j=; j<prime.size()&& prime[j]<i && t!=; j++)
{
if( seq[t] ) //若是质数,不用再求了
{
cnt[i]++;
break;
} if( t%prime[j]== ) cnt[i]++; //是因子
while( t%prime[j]== ) t/=prime[j]; //去掉该因子
}
} for(int i=; i<N; i++)
{
for(int j=; j<; j++) fval[i][j]=fval[i-][j];
fval[i][cnt[i]]++;
} } vector<int> val;
int cal(int L,int R)//处理询问
{
val.clear();
for(int i=; i>; i--)
{
if( fval[R][i]-fval[L-][i]> )
{
val.push_back(i);
val.push_back(i);
}
else if( fval[R][i]-fval[L-][i]== )
val.push_back(i);
}
int ans=;
for(int i=; i<val.size(); i++)
{
for(int j=i+; j<val.size(); j++)
ans=max(ans,__gcd(val[i],val[j]));
}
return ans;
}
int main()
{
freopen("input.txt", "r", stdin);
pre_cal();
int t, L, R;
cin>>t;
while(t--)
{
scanf("%d%d",&L,&R);
printf("%d\n",cal(L,R));
}
return ;
}
AC代码
HDU 5317 RGCDQ (质数筛法,序列)的更多相关文章
- hdu 5317 RGCDQ(前缀和)
题目链接:hdu 5317 这题看数据量就知道需要先预处理,然后对每个询问都需要在 O(logn) 以下的复杂度求出,由数学规律可以推出 1 <= F(x) <= 7,所以对每组(L, R ...
- HDU 5317 RGCDQ (数论素筛)
RGCDQ Time Limit: 3000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- HDU 5317 RGCDQ(素数个数 多校2015啊)
题目链接:pid=5317" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=5317 Prob ...
- 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 ...
- ACM学习历程—HDU 5317 RGCDQ (数论)
Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more an ...
- 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 ...
- HDU 5317 RGCDQ
题意:f(i)表示i的质因子个数,给l和r,问在这一区间内f(i)之间任意两个数最大的最大公倍数是多少. 解法:先用筛法筛素数,在这个过程中计算f(i),因为f(i)不会超过7,所以用一个二维数组统计 ...
- 2015 HDU 多校联赛 5317 RGCDQ 筛法求解
2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目 http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
随机推荐
- HDU 3998 Sequence (最长上升子序列+最大流)
参考链接:http://www.cnblogs.com/gentleh/archive/2013/03/30/2989958.html 题意:求一个序列的最长上升子序列,及其个数(注意:两个最长上升子 ...
- POJ 2140
#include<iostream> #include<stdio.h> using namespace std; int main() { int num; int i; i ...
- SQL技术内幕-13 SQL优化方法论之分离重量级的等待
Code -- Isolate top waits WITH Waits AS ( SELECT wait_type, wait_time_ms / . AS wait_time_s, . * wai ...
- poj 2449(A*求第K短路)
题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...
- Facebook揭密:如何让MySQL数据库集群自主运行
Facebook运行着全球最大的MySQL数据库集群,该集群分布在两个大洲上的多个数据中心中数以千计的服务器上.让人不解的是,Facebook只动用了一个很小的团队来管理这个庞大的MySQL数据库集群 ...
- @RequestBody 的正确使用办法
1.以前一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是 ...
- mysql模糊查询like/REGEXP
原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...
- Android百度地图开发02之添加覆盖物 + 地理编码和反地理编码
下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造Ov ...
- Mac显示和隐藏文件的命令
打开命令行输入即可,不过要重启Finder才能看到效果 显示: defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏: def ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...