洛谷 P1463 [SDOI2005]反素数ant && codevs2912反素数
2017-07-31 18:49
447 查看
题目描述
对于任何正整数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的约数数最多的数里面最小的
因为如果约数相同而另一个数比你小就不满足题意了
我们可以把一个数拆成一堆质因数的幂的和 S=2^x1+3^x2+...+p^xn(p仍旧为质数)
方案总数就是cnt=(x1+1)*(x2+1)*(x3+1)*…… 这个自己想想就知道了的
而我们只需要找前9个质数就好了因为前9个质数2*3*5*7*11*13*17*19*23*29=6,469,693,230>2,000,000,000
这样情况其实很少我们只需要来一次爆搜解决问题就好了哇
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int num[15]={0,2,3,5,7,11,13,17,19,23,29,31,33}; int n,ans,mx; void dfs(LL now,LL sum,int step){ if(now>mx) mx=now,ans=sum; if(now==mx&&ans>sum) ans=sum; for(int i=1;i<=50;i++){ if(sum*num[step]>n) break; sum=sum*num[step]; dfs(now*(i+1),sum,step+1); } } int main() { n=read(); ans=2000000007; dfs(1,1,1); printf("%d\n",ans); return 0; }View Code
相关文章推荐
- 洛谷 P1463 [SDOI2005]反素数ant && P1820 寻找AP数
- 暴力-洛谷P1463 [SDOI2005]反素数ant
- 洛谷P1463 [SDOI2005]反素数ant
- P1463 [SDOI2005]反素数ant
- BZOJ_P2190&&Codevs_P2296 [SDOI2008]仪仗队(欧拉函数线性筛)
- Codevs 1074&&洛谷 P2024 食物链
- codevs 2488 && codevs 2833 && 洛谷1137 拓扑排序模板
- Miller-Rabin随机性素数测试方法 & [CodeVS 1702] 素数判定2
- [SDOI2005]反素数ant
- 【数论】(贾志鹏)线性欧拉筛模板&&CODE[VS] 1453 统计素数个数2
- bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp
- Codevs 1069 && 洛谷 1525 关押罪犯 并查集
- 洛谷 P1463 [HAOI2007]反素数ant
- 约数和问题 (codevs2606 && 洛谷2424)
- codevs 1098 && 洛谷 P1031 均分纸牌 (修bug plus(两个注意*))
- 约数和问题 (codevs2606 && 洛谷2424)
- 洛谷 P1463 [SDOI2005]反素数ant
- 约数和问题 (codevs2606 && 洛谷2424)
- BZOJ2244 & Codevs1822 [SDOI2011]拦截导弹
- 【数论】埃氏筛法&&CODE[VS] 3223 素数密度 = =