设为首页 加入收藏

TOP

HDU 5317 RGCDQ (素因子分解+预处理)
2015-11-21 00:56:41 来源: 作者: 【 】 浏览:1
Tags:HDU 5317 RGCDQ 因子 分解 处理

?

求区间[l,r]所有数的素因子的种类的最大的最大公约数。。。额,不知道怎么描述了。。。

比如说区间内的所有数的素因子种类分别为1,2,3,4,5,6,7那么结果就是gcd(3,6)

分析:

数据的范围是1~1000000,因子数最大为7,我们首先要预处理出所有数的数的因子数,但是因为

数据的范围比较大我们不能直接暴力求结果,因为因子数的可能取值比较小,因此我们可以预处

理出每种取值数的前缀和,然后就可以在O(1)的的时间内求出区间内每种取值的数。

代码如下:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       using namespace std; const int maxn = 1e3+10; int pri[maxn],cnt; bool vis[maxn]; void getprime(){ cnt=0; memset(vis,0,sizeof(vis)); for(int i=2;i
      
       1) num[i]++; ff=max(num[i],ff); } sum[0][0]=0;sum[0][1]=0;sum[0][2]=0;sum[0][3]=0; sum[0][4]=0;sum[0][5]=0;sum[0][6]=0;sum[0][7]=0; for(int i=1;i<1000001;i++){ for(int j=1;j<=7;j++) sum[i][j]=sum[i-1][j]; sum[i][num[i]]++; } } int a[10]; int main() { init(); int t,l,r; scanf(%d,&t); while(t--){ scanf(%d%d,&l,&r); int tag = 0; for(int i=7;i>=1;i--) a[i]=sum[r][i]-sum[l-1][i]; for(int i=7;i>=3;i--){ if(a[i]>=2){ tag = i; break; } } if(tag){ printf(%d ,tag); } else{ if(a[3]>=1&&a[6]>=1){ puts(3); continue; } else if((a[2]>=1&&a[4]>=1)||a[2]>=2){ puts(2); continue; } else puts(1); } } return 0; } 
      
     
    
   
  

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇leetCode(52):Add Binary 下一篇趣味问题:画图(c++实现)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: