洛谷 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); }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。