hdu5317RGCDQ 打表

来源:互联网 发布:手机淘宝达人怎么申请 编辑:程序博客网 时间:2024/06/07 18:39
//F[x] 表示x的素数因子的大小//问在整数区间[l,r]的数gcd的最大值//由于F[x]的最大值为7//可以打表存下F[i][j] 表示前j个数中有i个素数因子的有几个//那么F[i][r] - F[i][l-1]表示的是[l,r]区间内有i个素数因子的数有几个#include<cstdio>#include<cstring>#include<iostream>using namespace std ;const int maxn = 1000010 ;int isp[maxn] ;int sum[maxn] ;int F[10][maxn] ;int a[10] ;void get_prime(){    memset(sum , 0 , sizeof(sum)) ;    memset(isp , 0 ,sizeof(isp)) ;    for(int i = 2;i < maxn;i++)    {        if(isp[i])continue ;        for(int j = i ;j < maxn ;j += i)        {            if(i != j)            isp[j] = 1;            sum[j] ++ ;        }    }}int gcd(int a , int b){    if(b == 0)return a ;    return gcd(b , a%b) ;}int main(){    int T ;    int L , R ;    get_prime() ;    memset(F , 0 , sizeof(F)) ;    for(int i = 1;i < maxn;i++)    {        for(int j = 1;j <= 7;j++)        F[j][i] = F[j][i-1] ;        F[sum[i]][i]++;    }    scanf("%d" ,&T ) ;    while(T--)    {        int l , r ;        scanf("%d%d" ,&l , &r) ;        int ma = 1 ;        for(int i = 2;i <= 7;i++)        {            a[i] = (F[i][r] - F[i][l-1]) > 1 ? i : 1;            if(F[i][r] - F[i][l-1] >= 2)ma = max(ma , i);            for(int j = 2;j < i;j++)            ma = max(gcd(a[i] , a[j]) , ma) ;        }        cout<<ma<<endl;    }}
0 0
原创粉丝点击