反素数(暴力)
反素数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5194 Accepted Submission(s): 3043
Problem Description
反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。
Input
第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
Output
输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.
Sample Input
3
2 3
1 10
47 359
Sample Output
2
6
240
Hint
2的因子为:1 2
10的因子为:1 2 5 10
题解:反素数模版没搞出来,暴力倒是立马ac。。。
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> using namespace std; typedef unsigned long long uLL; const uLL INF=(uLL)~0; const double PI=acos(-1.0); #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define T_T while(T--) #define P_ printf(" ") int prim[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; uLL ans,a,b; int nm,flot; /*void dfs(int pos,uLL v,int num){ if(num==nm&&ans>v)ans=v; if(v>=a&&v<=b&&num>nm)ans=v,nm=num,flot=1; for(int i=1;i<=63;i++){ if(v*prim[pos]>b)break; dfs(pos+1,v*=prim[pos],num*(i+1)); } }*/ int js(int temp){ int num=1; for(int i=2;i<temp;i++){ int x=0; if(temp%i==0){ while(temp%i==0)x++,temp/=i; num*=(x+1); } } if(temp>1)num*=2; return num; } int main(){ int T; SI(T); T_T{ scanf("%llu%llu",&a,&b); int nm=0; for(int i=a;i<=b;i++){ int temp=js(i); if(temp>nm)nm=temp,ans=i; } printf("%llu\n",ans); } return 0; }