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 的数值,那么最大公约数就是该数字。

假设没有出现两个反复的。那么结果要么是 3 (3,6) 要么是 2 (2,4)。 (4。 6), (2,6) 。假设都不是。那么就是 1。

我认为本题主要难点在筛法求F[x] 上。

#include <bits/stdc++.h>

using namespace std;

const int MAX = 1000000+2;
bool vis[MAX];
int f[MAX];
int s[8][MAX]; inline void init() // O(nlngn)
{
// 素数筛法 获取 f(x)
for(int i=2; i<MAX; ++i)
{
if (!vis[i]) // 没有被筛去
{
f[i]++; // 自身是素数,自增 // 筛去i的倍数。 同一时候将f[i的倍数]++。由于i的倍数值,肯定含有i 这个质因子
for(int j=i+i; j<MAX; j+=i)
{
f[j]++;
vis[j] = true; // 筛去
}
}
} // 统计区间 2-i 各有多少个 1 2 3 4 5 6 7
for(int i=2; i<MAX; ++i)
{
for(int j=1; j<=7; ++j)
{
s[j][i] = s[j][i-1]; // 取上一次的结果
if (f[i] == j) // 当前值能够进行累加
s[j][i]++;
}
}
} inline int getMaxGCD(int l, int r)
{
int arr[8] = {};
for(int i=1; i<=7; ++i)
{
arr[i] = s[i][r] - s[i][l-1];
} // 是否有2个以上的情况
for(int i=7; i>2; --i)
{
if (arr[i] >= 2)
return i;
} // 处理单个的情况
if (arr[3]+arr[6] >= 2)
return 3; if (arr[2]+arr[4]+arr[6] >= 2)
return 2; return 1;
} int main(void)
{
//freopen("in.txt", "r", stdin); init(); int t = 0;
scanf("%d", &t);
while(t--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", getMaxGCD(l, r));
} return 0;
}

另外在杭电上。也有一道类似的题目, 主要考察筛法。

题目  http://acm.hdu.edu.cn/showproblem.php?pid=1215

// 数据量特别大,一定要做预处理

#include <bits/stdc++.h>

using namespace std;

const int MAX = 500000+2;
int ans[MAX] = {}; inline void init()
{
ans[1] = 1;
for(int i=2; i<MAX; ++i)
{
ans[i]++;
for(int j=i+i; j<MAX; j+=i)
{
ans[j] += i;
}
}
} int main(void)
{
//freopen("in.txt", "r", stdin); init(); int t, n;
cin>>t;
while(t--)
{
scanf("%d", &n);
printf("%d\n", ans[n]);
} return 0;
}

測试用例数量非常大且数据量大的时候。应该做预处理

2015 HDU 多校联赛 5317 RGCDQ 筛法求解的更多相关文章

  1. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  2. 数学+dp HDOJ 5317 RGCDQ

    题目传送门 /* 题意:给一个区间,问任意两个数的素数因子的GCD最大 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, dp[ ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  5. [HDU多校]Ridiculous Netizens

    [HDU多校]Ridiculous Netizens 点分治 分成两个部分:对某一点P,连通块经过P或不经过P. 经过P采用树形依赖背包 不经过P的部分递归计算 树型依赖背包 v点必须由其父亲u点转移 ...

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

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

  7. 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 ...

  8. HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧

    题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...

  9. 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 ...

随机推荐

  1. 关于fmri数据分析的两大类,四种方法

    关于fmri数据分析的两大类,四种方法: 数据驱动: tca:其实这种方法,主要是提取时间维的特征.如果用它来进行数据的分析,则必须要利用其他的数据方法,比如结合ICA. ica:作为pca的一般化实 ...

  2. OpenShift和F5的集成手册

    OpenShift和F5的集成步骤,记录如下,如实际操作中有变更会再度编辑修改. 1.整体架构 使用BIG-IP作为Openshift的Router,能实现以下功能: 为Services创建BIG-I ...

  3. sharememory.c

    //进程通信,共享存储区 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #i ...

  4. BP反向传播算法的工作原理How the backpropagation algorithm works

    In the last chapter we saw how neural networks can learn their weights and biases using the gradient ...

  5. split-array-largest-sum(参考了discuss)

    注意,第一种用法,涉及到一些Java的知识.就是采用Object作为HashMap的key的时候,需要重载这个Class的 equals 和 hashCode 这两个方法.其中equals需要判断一下 ...

  6. HTML5/CSS3实现添加锁屏效果

     锁屏效果,也就是将屏幕置于模态,不允许用户触发任何动作,只能解除锁定后才能继续使用,jQueryUI的dialog有模态对话框,这一点不难做到.那么,首先需要在页面中添加一个div层,用于做模态的层 ...

  7. 用php当作cat使用

    今天,本来是想敲 node test.js 执行一下,test.js文件,结果 惯性的敲成了 php  test.js, 原文输出了 test.js的内容. 突然觉得,这东西 感觉好像是 cat  命 ...

  8. 统计的一个小题目python实现

    最近面试碰到的一个题目,业余时间用python实现的. 拿到数据,先用sort 命令排序,也可再进一步去重复 sort -k 1,2  data.txt |uniq  > data.new # ...

  9. 如何在Visual Studio(VS)2012里使用libsvm工具箱

    原文:http://blog.csdn.net/u014691453/article/details/40393137 软件版本: Visual Studio版本:VS2012 (注:使用方法在 VS ...

  10. 通过Intel XDK编写跨平台app(一)

    Intel XDK 是一个新的跨平台手机应用开发工具.它努力把整个开发流程变的简单,尽可能把所有的平台都封装到一个包中,通过收集各种开发工具来使你的开发变的简单. 在这篇文章中,我将会向你介绍什么是I ...