Codevs2461反质数
来源:互联网 发布:犹大福音 知乎 编辑:程序博客网 时间:2024/05/20 22:26
http://codevs.cn/problem/2461/
Codevs2912,洛谷P1463与此题完全相同….
虽然分别是06浙江07河南和05山东的省队选拔赛题目…..
注意题目有问题..是求最小的反质数。
思路
首先要明确一个结论:
某一个数的因子数 = 组成这个数的各质因子数的次数+1的乘积。可以由唯一分解定理和乘法原理得到。
这是我们统计因子数的计算式。
那么我们就将一个反质数看作选取了质因子数及质因子数的次幂的乘积,DFS确定选取方案。
然后为了在因子数尽量多的前提下,使答案尽量小,对于一个反质数,则可使较小因子的次数尽量大。
——实现为:质因子从小到大选取,且后一质因子选取的次数小于前一质因子,且使总的质因子数尽量大。
对于质因子,我们可以事先写出一些质数使用,我们发现,若每个质因子都只选一个…选了12个质因子相乘之积便>2*10^9了,故x只需选取至第11个质数即可,我们的质数表也只需写至11位(这里写了13位,足够1-10^16范围使用,无伤大雅)。
应该注意的一点是,我们(打表)发现,随着n的增长范围内反质数的因子数也随之增多..故质数表必须随之n值增大而增大。
代码
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;long long n,maxd,ans;int prime[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41};void dfs(int x,long long sum,long long nowd,long long Limit)//第几个质数,质数乘积,sum的因子数,质因子次数限制(质因子由小到大,后面的质因子次数一定小于前面的) { if (nowd>maxd||(nowd==maxd&&sum<ans))//因子数更多或因子数相同但反质数小 maxd=nowd,ans=sum; if(x>11) return; for (int i=1;sum*prime[x]<=n&&i<=Limit;i++) dfs(x+1,sum*=prime[x],nowd*(i+1),i);//注意nowd的统计方法}int main(){ scanf("%lld",&n); ans=1; if(n>1) dfs(1,1,1,1e9); printf("%lld\n",ans); return 0; }
这个题在之前的 >NOIP2017清北综合强化试题< Day6 Problem 1中就以写到,但写的较为粗略和模糊,这一篇就算是对这个题的细致补充吧。
阅读全文
0 0
- Codevs2461反质数
- 反质数
- WIKIOI 2461 反质数
- [bzoj1053]反质数
- vijos 1172反质数
- [JSOI2016]反质数序列
- SDOI2005 反质数
- NOI库7591 反质数
- 反质数(noi题库)
- 【Vijos-P1172】反质数-DFS
- Vijos 1172题:反质数
- codevs 2461 反质数(题解)
- noip题库 —— 4.7反质数
- bzoj3085: 反质数加强版SAPGAP
- [搜索 剪枝] BZOJ3085 反质数加强版SAPGAP
- Vijos p1172 反质数(求约数个数)
- [POJ2886] 谁得到最多糖果 - 反质数+线段树
- 质数
- Oracle 安装步骤 day01
- 累加求和
- Jingxhan Diary (1)
- 【剑指offer】1-10题
- bzoj5072 小A的树
- Codevs2461反质数
- C++智能指针
- 利用JFrame挂菜单栏演示
- 流媒体 基础知识
- 多态新理解
- sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历
- Spark性能调优——基础篇
- 09-面向对象(异常-finally代码块) 10-面向对象(异常-异常应用)1 2 3 4 11-面向对象(异常-异常注意事项)
- Merge k Sorted Lists