区间最多约数
来源:互联网 发布:燕郊招聘淘宝客服 编辑:程序博客网 时间:2024/05/29 19:27
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e7+5,M=3200;vector<int> prime;int pri[M]={0};int mx,ans;int pricnt;int li,ri;void f(){ pri[0]=pri[1]=1; for(int i=2;i<M;i++) if(!pri[i]) { prime.push_back(i); for(int j=i*i;j<M;j+=i) pri[j]=1; }}void dfs(int cur,int cnt,int pos,int L,int R){ if(cnt>mx&&pos>=li) mx=cnt,ans=pos; else if(cnt==mx&&ans>pos&&pos>=li) ans=pos; if(L==R&&L>pos) dfs(cur,cnt<<1,pos*L,1,1); for(int i=cur;i<pricnt;i++) { if(prime[i]>R) return; int curp=prime[i],l=L-1,r=R,LL=L,num=pos,sum=cnt,m=1; while(1) { m++; sum+=cnt; l/=curp; r/=curp; LL/=curp; if(l==r) break; num*=prime[i]; dfs(i+1,sum,num,LL,r); } if(cnt<mx/(1<<m))return; }}int main(){ f(); pricnt=prime.size();// cout<<pricnt<<endl; while(~scanf("%d%d",&li,&ri)) { if(li==1&&ri==1) { puts("[1,1] 1 1\n1"); continue; } mx=1; dfs(0,1,1,li,ri); printf("[%d,%d] %d %d\n",li,ri,ans,mx); vector<int> out; int tmpp=sqrt(ans+0.5); for(int j=1;j<=tmpp;j++) if(ans%j==0) { out.push_back(j); out.push_back(ans/j); } if(tmpp*tmpp==ans)out.pop_back(); sort(out.begin(),out.end()); for(int i=0;i<out.size();i++) { if(i) printf(" "); printf("%d",out[i]); } puts(""); }}
阅读全文
0 0
- 区间最多约数
- 最多约数
- 最多约数问题
- 最多约数问题
- 最多约数问题
- 最多约数问题
- 【最多约数问题】
- 问题八十六:最多约数
- 最多约数问题
- 最多约数问题
- 【最多约数问题】
- 最多约数问题
- 最多约数问题
- NOJ1203 最多约数问题
- 最多约数问题
- 最多约数问题
- 最多约数问题
- 最多约数问题
- poj 1088 滑雪
- 【Unity学习笔记】——基础篇:多细节层次LOD技术
- 在unity3d中动态创建easyAR的imageTarget
- 【c#】c#中 函数参数的注意事项
- 七月算法深度学习 第三期 学习笔记-第一节 数学基础
- 区间最多约数
- jQuery基础知识
- Java-ZipUtil工具类
- echarts动态绘制折线图
- github设置添加SSH
- 欢迎使用CSDN-markdown编辑器
- 公司是怎么招聘软件工程师的---朱有鹏物联网大讲堂
- 趣解Spring-Ioc的含义及注入方式
- CW3003/CW3004/3005赛微双通道智能USB识别充电芯片方案