搜索


  经典搜索题目(其实是蒟蒻只会搜……vfleaking好像有更优秀的做法?)

  枚举质数的幂,其实深度没多大……因为$2^32$就超过N了……而且质数不能取的太大,所以不会爆……

 /**************************************************************
Problem: 1053
User: Tunix
Language: C++
Result: Accepted
Time:40 ms
Memory:1760 kb
****************************************************************/ //BZOJ 1053
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=2e9,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/
int n,prime[],tot;
LL mx=,ans=;
bool vis[];
//第x个质数,总乘积为now,因数个数为m
void dfs(int x,LL now,LL m,int lim){
if (m>mx && now<=n){
mx=m; ans=now;
}
if (m==mx && now<ans && now<=n) ans=now;
if (x>) return;
LL p=now;
F(i,,lim){
if (p*prime[x]>n) break;
p*=prime[x];
dfs(x+,p,m*(i+),lim-i);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1053.in","r",stdin);
freopen("1053.out","w",stdout);
#endif
scanf("%d",&n);
F(i,,sqrt(N)){
if (!vis[i]){
prime[++tot]=i;
for(int j=i*i;j<=sqrt(N);j+=i) vis[j]=;
}
}
dfs(,,,);
printf("%lld\n",ans);
return ;
}

1053: [HAOI2007]反素数ant

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1821  Solved: 1014
[Submit][Status][Discuss]

Description

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?

Input

一个数N(1<=N<=2,000,000,000)。

Output

不超过N的最大的反质数。

Sample Input

1000

Sample Output

840

HINT

Source

[Submit][Status][Discuss]

04-21 18:37