题意:求n和m之间的全部数的素因子个数的最大gcd值。

分析:这题好恶心。看着就是一颗线段树。但本题有一定的规律,我也是后来才发现,我还没推出这个规律。就不说了,就用纯线段树解答吧。

由于个点数都小于1000000所以素因子个数不会超过7个所以建一个线段树,最以下一层是每一个节点的素因子个数为1,2。3,4,5,6。7的有多少个,父节点求和。终于查询的是n到m之间有多少个1,2,3。4。5,6,7然后存在就求一下gcd着最大就好了

本题最重要的时间和空间。显然线段数中的点不会非常大,所以採用short类型

代码例如以下:

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
#include <utility>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <functional> using namespace std;
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
const int N=100000;
int prime[N]={0};
int num_prime=0;
bool isNotPrime[N]={1,1};
void su1(){
for(long i = 2 ; i < N ; i ++){
if(!isNotPrime[i])
prime[num_prime++]=i;
for(long j = 0 ; j < num_prime &&i*prime[j]<N ;j ++) {
isNotPrime[i * prime[j]] = 1;
if( !(i % prime[j]))break;
}
}
}
int prime_solve(int n){
int k=0;
for(int i=0;i<num_prime&&prime[i]*prime[i]<=n;i++){
// cout<<prime[i]<<endl;
if(n%prime[i]==0){
while(n%prime[i]==0){
n/=prime[i];
}
k++;
}
}
if(n!=1)k++;
return k;
}//素因子分解求n的素因子个数
short a[4000005][8];
void updat(int id,int j,int l,int r,int mid){
if(l==r){
a[mid][j]=1;
return;
}
int i=(l+r)>>1;
if(id<=i)updat(id,j,l,i,2*mid);
else updat(id,j,i+1,r,2*mid+1);
a[mid][j]=a[2*mid][j]+a[2*mid+1][j];
}
int sum[8];
void su(int l,int r,int mid,int ll,int rr){
if(l>=ll&&r<=rr){
for(int i=1;i<=7;i++)
sum[i]+=a[mid][i];
return;
}
int i=(l+r)>>1;
if(ll<=i)su(l,i,2*mid,ll,rr);
if(rr>i)su(i+1,r,2*mid+1,ll,rr);
}//建树,求和,这是重点
int main(){
memset(a,0,sizeof(a));
su1();
// for(int i=1;i<=100;i++){
// if(isNotPrime[i])
// cout<<i<<" "<<prime_solve(i)<<endl;;
// }
// cout<<endl;
for(int i=2;i<=1000005;i++){
int d=prime_solve(i);
updat(i,d,2,1000005,1);
}
int n,m;
int t;
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum));
su(2,1000005,1,n,m);
int ans=-1;
for(int i=1;i<=7;i++)
for(int j=1;j<=7;j++){
if(i==j){
if(sum[i]>1)ans=max(ans,gcd(i,j));
}
else{
if(sum[i]>0&&sum[j]>0)ans=max(ans,gcd(i,j));
}
}//这个地方就能够纯暴力了
printf("%d\n",ans);
}
return 0;
}

RGCDQ(线段树+数论)的更多相关文章

  1. HDU5152 线段树 + 数论

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5152 ,线段树区间更新 + 点更新 + 数论知识(数论是重点QAQ),好题值得一做. BestCode ...

  2. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 && 数论)

    Description In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence ...

  3. uoj#38. 【清华集训2014】奇数国(线段树+数论)

    传送门 不难看出就是要先求区间积,再求这个区间积的\(\varphi\) 因为\(\varphi(x)=x\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\ ...

  4. HDU 5239 上海大都会 D题(线段树+数论)

    打表,发现规律是存在一定次数(较小)后,会出现a=(a*a)%p.可以明显地发现本题与线段树有关.设置标记flag,记录本段内的数是否均已a=a*a%p.若是,则不需更新,否则更新有叶子结点,再pus ...

  5. 2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest K - Random Numbers (dfs序 线段树+数论)

    Tamref love random numbers, but he hates recurrent relations, Tamref thinks that mainstream random g ...

  6. poj---(2886)Who Gets the Most Candies?(线段树+数论)

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 10373   Acc ...

  7. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  8. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)

    In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 ...

  9. Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]

    洛谷 Codeforces 思路 这题知道结论就是水题,不知道就是神仙题-- 斐波那契数有这样一个性质:\(f_{n+m}=f_{n+1}f_m+f_{n}f_{m-1}\). 至于怎么证明嘛-- 即 ...

随机推荐

  1. thinkphp内置标签简单讲解

    thinkphp内置标签简单讲解 1.volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 ...

  2. 淘宝的css初始化代码

    ;; } body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; } h1, h2, h3, h ...

  3. 三、Docker镜像的相关操作

    原文:三.Docker镜像的相关操作 一.查看本地镜像: docker images 二.使用某个镜像来运行容器: docker run -t -i xxxx(镜像名):xx.xx(版本,不带即最新) ...

  4. 洛谷 P1626 象棋比赛

    P1626 象棋比赛 题目描述 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加两场对弈,最少参加零场对弈.每个人都有一个与其他人不相同的等级(用一个正整数来表示). 在对弈中,等级高 ...

  5. 亚马逊AWS学习——EC2的自己定义VPC配置

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47153421 本文出自[我是干勾鱼的博客] 1 网络配置 EC2即亚马逊AWS云 ...

  6. 含有过滤功能的android流式布局

    FilterFlowLayout 含有过滤功能的流式布局, 參考FlowLayout 能够去除宽度不在范围(比例或真实值)内的子view 能够设置最大行数 能够加入组件间水平间距 能够加入行间距 系统 ...

  7. HTML中select的option设置selected=&quot;selected&quot;无效的解决方式

    今天遇到了一个奇葩问题,写HTML时有个select控件.通过设置option的selected="selected"竟然无效,可是在其它浏览器是能够的.问了一下Google大神, ...

  8. crm翻译导航栏

    在crm里面怎样翻译导航栏? 过程例如以下: 1 先新建一个解决方式.把网站地图加进去 2: 然后把这个解决方式到出来来,解压文件: 3:编辑第二个文件: watermark/2/text/aHR0c ...

  9. Codeforces Round #367 (Div. 2) (A,B,C,D,E)

    Codeforces Round 367 Div. 2 点击打开链接 A. Beru-taxi (1s, 256MB) 题目大意:在平面上 \(n\) 个点 \((x_i,y_i)\) 上有出租车,每 ...

  10. 关于pcb铺铜