1. 程式人生 > >洛谷 P1463 [SDOI2005]反素數ant

洛谷 P1463 [SDOI2005]反素數ant

要求 簡單的 簡單 sticky 描述 搜索 個數 最大 整數

P1463 [SDOI2005]反素數ant

題目描述

對於任何正整數x,其約數的個數記作g(x)。例如g(1)=1、g(6)=4。

如果某個正整數x滿足:g(x)>g(i) 0<i<x,則稱x為反質數。例如,整數1,2,4,6等都是反質數。

現在給定一個數N,你能求出不超過N的最大的反質數麽?

輸入輸出格式

輸入格式:

一個數N(1<=N<=2,000,000,000)。

輸出格式:

不超過N的最大的反質數。

輸入輸出樣例

輸入樣例#1:
1000
輸出樣例#1:
840
思路:數論+搜索。可以發現題目要求的是小於n的約數最大的數(如果有相同的就取最小的),然後就是個很簡單的打表+搜索。
錯因:素數表打錯了,崩潰~~~~(>_<)~~~~
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dx[15]={0,2,3,5,7,11,13,17,19,23,29,31,37};
long long s[100];
long long n,ans,maxn;
void dfs(long long x,int y,int
z){ //有y個約數。 if(z==13) return; //已經有了z個質數。 if(y>maxn||y==maxn&&x<ans) maxn=y,ans=x; s[z]=0; while(x*dx[z]<=n&&s[z]<s[z-1]){ s[z]++; x*=dx[z]; dfs(x,y*(s[z]+1),z+1); } } int main(){ scanf(
"%lld",&n); s[0]=10000000; dfs(1,1,1); printf("%lld",ans); }

 

洛谷 P1463 [SDOI2005]反素數ant