洛谷 P1463 [SDOI2005]反素數ant
阿新 • • 發佈:2017-09-02
要求 簡單的 簡單 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,intz){ //有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