http://acm.hdu.edu.cn/showproblem.php?pid=5317
大意:求出
分析:直接分解再而重循环肯定超时。
需要从素因子的个数入手,换个角度思考。 在1——1e6的范围内最多有7个素数相乘。1 2 3 4 5 6 7中有非素数1 4 6。
设素数个数是i的数字的个数是sum[i]
那么sum[4]的个数得加到sum[2]与sum[1]上,sum[6] 的个数加到sum[1],sum[2],sum[3]上
计算sum[i]:
for i , get f[i] and refresh dp[i][j]=dp[i-1][j]
dp[i][f[i]]++;
sum[i]=dp[r][i]-dp[l-1][i]
最后,从高到底遍历7——1,sum[i]>=2,则取之。(由直接求解转化为素因子个数问题)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N=1e6+10;
typedef long long LL;
int f[N];
int dp[N][10];
int sum[10];
void init(){
for(int i=2;i<N;i++) f[i]=0;
for(int i=2;i<N;i++){
if(f[i]==0){
for(int j=i;j<N;j+=i) f[j]++;
}
}
for(int i=2;i<N;i++){
for(int j=1;j<=7;j++) dp[i][j]=dp[i-1][j];
dp[i][f[i]]++;
}
}
int main(){
init();
int t,l,r;
cin>>t;
while(t--){
scanf("%d%d",&l,&r);
for(int i=1;i<=7;i++){
sum[i]=dp[r][i]-dp[l-1][i];
}
sum[1]+=sum[4]+sum[6];
sum[2]+=sum[4]+sum[6];
sum[3]+=sum[6];
if(sum[7]>=2) puts("7");
else if(sum[6]>=2) puts("6");
else if(sum[5]>=2) puts("5");
else if(sum[4]>=2) puts("4");
else if(sum[3]>=2) puts("3");
else if(sum[2]>=2) puts("2");
else puts("1");
}
return 0;
}