P1463 [SDOI2005]反素数ant
来源:互联网 发布:sql identity是什么 编辑:程序博客网 时间:2024/05/27 09:46
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
一道水题 就是找最大的反素数
我们先建一棵搜索树
以12为例
从根节点到每个叶子节点路径上的数乘起来就是12的约数
我们可以按照这个思路来找反素数 具体解释见代码
这个题n<=2*10^9 不会超过int
log2(2*10^9)大约在30左右
所以我们每一个素数最多递归30层
记录当前到了第几个素数 这个素数用了几遍 产生几个约数 当前的now是多少
1 #pragma GCC optimize(2) 2 #include <cstdio> 3 #include <cctype> 4 5 typedef long long LL; 6 7 LL ans; 8 9 #define Inline __attri\10 bute__( ( optimize( "-O2" ) ) )11 12 int n,Now;13 14 int prime[20]={0,2,3,5,7,11,13,17,19,23,29};15 16 Inline void DFS(int num,int Np,LL now) {17 if(now>n) return;//如果当前数now大于n 就返回 最优性剪枝18 if(Np>Now||Np==Now&&now<ans) {Now=Np;ans=now;} 19 // 如果当前约数个数大于目前全局最优解 或者约数个数等于全局最优解但是当前数要大于目前全局最优解 就更新20 LL t=1,s=0;// s为当前素数使用了几次 t则就是当前素数使用了s次产生的约数21 for(int i=1;i<=30;++i) {22 t*=prime[num];23 ++s;24 if(now*t>n) return;// 当前数now乘约数t产生的数大于n 说明当前搜索方向无法产生解25 DFS(num+1,Np*(s+1),now*t);26 }27 }28 29 int hh() {30 scanf("%d",&n);31 DFS(1,1,1);32 printf("%lld\n",ans);33 }34 35 int sb=hh();36 int main(int argc,char**argv) {;}
阅读全文
0 0
- P1463 [SDOI2005]反素数ant
- 洛谷 P1463 [SDOI2005]反素数ant
- 暴力-洛谷P1463 [SDOI2005]反素数ant
- 洛谷P1463 [SDOI2005]反素数ant
- [SDOI2005]反素数ant 洛谷p1463
- 洛谷 P1463 [SDOI2005]反素数ant && P1820 寻找AP数
- 【洛谷1463】[SDOI2005]反素数ant
- SDOI2005反素数
- 【bzoj 1053/P1463】反素数 HAOI2007(爆搜)
- [HAOI2007]反素数ant
- BZOJ 反素数ant
- [HAOI2007]反素数ant
- [HAOI2007]反素数ant
- 【Bzoj1053】反素数ant
- 反素数ant BZOJ
- bzoj1053反素数ant
- [HAOI2007]反素数ant
- SDOI2005 反质数
- 1806: [Ioi2007]Miners 矿工配餐
- P2424 约数和
- UVa 11440 Help Tomisu 欧拉函数
- UVa 1575 Factors
- 三种求乘法逆元方法详解
- P1463 [SDOI2005]反素数ant
- cocos2d Anroid 打包Apk
- 【NOIP2016】蚯蚓 --队列模拟
- 1624 取余最长路 (前缀和+set二分)
- P1118 [USACO06FEB]数字三角形Backward Digit Su…
- 1640 天气晴朗的魔法
- 51Nod 1378 夹克老爷的愤怒
- 1737 配对
- [SDOI2009]Elaxia的路线 SPFA+Topo