题目大意:有x<1000000,定义f(x),为它的素数因子,现在给你个区间,让你找出区间里边gcd(f(x1),f(x2))最大的数,其中x1,x2,在区间内
解题思路:预处理一下即可,不要用整数唯一分解定理,要超时,一个一个加着来看;
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000000+10;
int L,R,T;
int F[maxn],s[maxn][8];
int main()
{
//freopen("1002.in","r",stdin);
// freopen("1002.out","w",stdout);
int k,p,flag;
memset(F,0,sizeof(F));
k = 2;
while (1)
{
p = k;
while (p <=1000000)
{
F[p]++;
p += k;
}
p = k + 1;
flag = 0;
while (p <= 100000)
{
if (!F[p])
{
k = p;
flag = 1;
break;
}
p++;
}
if (!flag) break;
}
memset(s,0,sizeof(s));
for (int i = 2; i <= 1000000; i++)
{
for (int j = 1; j < 8; j++)
{
s[i][j] =s[i - 1][j];
if (j == F[i])
s[i][j]++;
}
}
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&L,&R);
int cnt[8];
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=7;i++)
{
cnt[i]=s[R][i]-s[L-1][i];
}
int ans=1;
if(cnt[2]+cnt[4]+cnt[6]>=2) ans=2;
if(cnt[3]+cnt[6]>=2) ans=3;
if(cnt[4] >= 2) ans = 4;
if(cnt[5] >= 2) ans= 5;
if(cnt[6] >= 2) ans= 6;
if(cnt[7] >= 2) ans= 7;
printf("%d\n", ans);
}
}