HDU 5317(2015多校3)-RGCDQ(数论)

题目地址:HDU 5371

题意:每次T(1000000)次询问,每次询问有一个区间[L, R] (2 <= L < R <= 1000000 )。 f(i) 表示的是数i的素因子种类数。 然后求这个区间内GCD(f(i), f(j))的最大值,(L <= i < j <= R )。

思路:2*3*5*7*9*11*13=270270<1e6<2*3*5*7*9*11*13*17=4594590.所以f的最大值为7。开一个cnt[ maxn ] [ 8 ] 的数组来记录在第 i 个数之前(1-7)数字各出现了几次。 然后每次只要暴力这7个数来确定最大的gcd就行了。最后遍历的时候记得分情况讨论一下。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=1e6+10;
int isprime[maxn];
int f[maxn];
int cnt[maxn][8];
int tmp[8];
void Solve()
{
    memset(isprime,0,sizeof(isprime));
    for(int i=2;i<=maxn;i++){
        if(!isprime[i]){
            f[i]=1;
            for(int j=i*2;j<=maxn;j+=i){
                isprime[j]=1;
                f[j]+=1;
            }
        }
    }
    for(int i=2;i<=maxn;i++){
    for(int j=1;j<=7;j++){
        cnt[i][j]=cnt[i-1][j];
    }
        cnt[i][f[i]]++;
    }
}
int gcd(int a,int b)
{
    while(b!=0){
        int r=b;
        b=a%b;
        a=r;
    }
    return a;
}
int main()
{
    int T,l,r;
    int maxx;
    scanf("%d",&T);
    Solve();
    while(T--){
        memset(tmp,0,sizeof(tmp));
        scanf("%d %d",&l,&r);
        for(int i=1;i<=7;i++)
        tmp[i]=cnt[r][i]-cnt[l-1][i];
        maxx=-inf;
        for(int i=1;i<=7;i++)
        for(int j=1;j<=7;j++){
            if(i==j&&tmp[i]>=2)
               maxx=max(maxx,i);
            else if(i!=j&&tmp[i]>=1&&tmp[j]>=1)
                maxx=max(maxx,gcd(i,j));
        }
        printf("%d\n",maxx);
    }
    return 0;
}

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

时间: 2024-10-05 22:46:53

HDU 5317(2015多校3)-RGCDQ(数论)的相关文章

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

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列. 思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度.然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度,然后找到右边对应的'-1',判断p[i]是不是大于所穷举的长度,如果当前的满足三段,那么就跳出,继续

HDU 5349(2015多校5)-MZL&#39;s simple problem(优先队列)

题目地址:HDU 5349 很水的优先队列就能搞好,只不过注意如果2操作结束后的队列为空,那么Max的值为-inf. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set&

HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

题目地址:HDU 5323 题意:给一个l,r,表示区间[l,r],问是否存在区间为[0,n]的线段树的节点区间为[l,r],如果有求最小的n,如果没有输出-1. 思路:因为L/(R-L+1)<=2015,按照线段树的性质每次分区间序号扩大两倍,所以可以得出差不多有22层,所以用爆搜就可以,由上把[l,r]区间不断扩张,直到满足l==0为止.顺便剪剪枝. #include <stdio.h> #include <math.h> #include <string.h>

HDU 5387(2015多校8)-Clock(模拟)

题目地址:HDU 5387 题意:给你一个格式为hh:mm:ss的时间,问时针与分针.时针与秒针.分针与秒针之间夹角的度数是多少,若夹角度数不是整数,则输出A/B最简分数形式. 思路:每秒钟,分针走是0.1°,时针走(1/120)°:每分钟,时针走0.5°.所以对于时针的角度来说总共走动了h*30+m*0.5+s/120,对于分针的角度来说总共走掉了m*6+s*0.1,对于秒针来说,总共走动了s*6.因为乘法比较除法来说时间复杂度更精确一点,所以我们把走的角度*120,变成全部都是整数,最后再除

hdu 5361 2015多校联合训练赛#6 最短路

In Touch Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 67    Accepted Submission(s): 11 Problem Description There are n soda living in a straight line. soda are numbered by  from left to ri

HDU 5358(2015多校联合训练赛1006) First One (区间合并+常数优化)

HDU 5358 题意: 求∑?i=1?n??∑?j=i?n??(?log?2??S(i,j)?+1)?(i+j). 思路: S(i,j) < 10^10 < 2^34,所以log2(S)+1的值只可能在1~35之间.由于log变化缓慢的函数特性,我们可以S(i,n)分作多个相同log值的区间来计算,用pos[i][j]预处理记录每个以i为起点,log(s)值为j的区间的右边界,即可优化至nlogn的复杂度. 主要是写起来比较难一些,一些细节比较纠结,一定思路理清后再写. ps.此题卡常数毫无