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>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int X=1000010;
 8 bool isPrime[X+1];
 9 int total;//计数
10 int prime[79000];
11 void getPrime()
12 {
13     total=0;
14     memset(isPrime,true,sizeof(isPrime));
15     memset(prime,0,sizeof(prime));
16     for(int i=2;i<=X;i++)
17     {
18         if(isPrime[i]) prime[total++]=i;
19         for(int j=0; j<total && i*prime[j]<=X; j++)
20         {
21             isPrime[i*prime[j]]=false;
22             if(i%prime[j]==0)
23                 break;
24         }
25     }
26 }
27
28 int dp[X][9];
29 int num[X];
30 void getCot()
31 {
32     memset(num,0,sizeof(num));
33     for(int i=0;prime[i]<=1000000;i++)
34         for(int j=prime[i];j<=1000000;j+=prime[i])
35             num[j]++;
36 }
37
38 void gao()
39 {
40     memset(dp,0,sizeof(dp));
41     dp[2][1]=1;
42     for(int i=3;i<=1000000;i++)
43     {
44         int ans=num[i];
45         for(int j=1;j<=7;j++)
46             dp[i][j]=dp[i-1][j];
47         dp[i][ans]++;
48     }
49 }
50 int main()
51 {
52     int T,l,r,aa[10],ma;
53     getPrime();
54     getCot();
55     gao();
56     scanf("%d",&T);
57     while(T--)
58     {
59         ma=1;
60         scanf("%d%d",&l,&r);
61         for(int i=1;i<=7;i++)
62         {
63             aa[i]=dp[r][i]-dp[l-1][i];
64             if(aa[i]>=2&&i>ma)
65                 ma=i;
66         }
67         if(aa[6]>0&&aa[3]>0)
68             ma=max(ma,3);
69         else if(aa[6]>0&&aa[2]>0||aa[4]>0&&aa[2]>0)
70             ma=max(ma,2);
71         printf("%d\n",ma);
72     }
73     return 0;
74 }

时间: 2024-10-12 21:25:44

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

hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316 题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改成b:当t=0时,查询区间a,b之间最大的子序列和,这个子序列中的相邻的元素的原来的下标奇偶性都不同. 思路:这道题难点就在查询,其余都是模板,而根据查询,你只要分别把下一个区间的奇偶最大的情况分别比较,合并到上一个区间这样可以构建一个每个节点存有区间中奇开头偶开头,奇结尾,偶结尾这些区间情况的树.

2018 HDU多校第三场赛后补题

2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube 题意: 在画布上画一个三维立方体. 题解: 模拟即可. 代码: #include <bits/stdc++.h> using namespace std; int a, b, c, R, C; char g[505][505]; int main () { int T; cin >>

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

题目连接:戳ME 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(10=2*5),f[12]=2(12=2*2*3). 分析:很容易想到先将f[x]求出来,这里x最大1e6,要在常数时间内求出f[x].并且稍加分析就知道1<=f[x]<=7,可以用一个dp[i][j]表示从f[1]到f[i]有多少个j.这样就可以在常数时间内预处理出来,后面在O(1)的时间内就可以输出结果.并且

HDU 5316 Magician(2015多校第三场 线段树)

Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1700    Accepted Submission(s): 503 Problem Description Fantasy magicians usually gain their ability through one of three usual methods

HDU 5355 Cake(2015多校第六场,搜索 + 剪枝)

Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 965    Accepted Submission(s): 119 Special Judge Problem Description There are m soda and today is their birthday. The 1-st soda has prepa

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

2014多校第三场1005 || HDU 4891 The Great Pan(模拟)

题目链接 题意 : 给你n行字符串,问你有多少种理解方式.有两大类的理解 (1){A|B|C|D|...}代表着理解方式可以是A,可以是B或C或者D. (2)$blah blah$,在$$这两个符号中间,如果是不连续的空格的那个位置就有2种理解方式,可以理解为没有空格也可以理解为有空格.如果有连续N个空格的位置,那里就有N+1种理解方式. 最后所有的理解方式相乘,数据保证$一定与$匹配,{一定与匹配},不会有任何嵌套,类似{$$}或者{{}}或者${}$这种情况都不会出现,也不会有{$}这种情况