hdu 5317 RGCDQ (dp+筛法)

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; 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值