zoj 1562 反素数 附上个人对反素数性质的证明
反素数的定义:对于不论什么正整数,其约数个数记为
。比如
,假设某个正整数
满足:对随意的正整
数。都有
,那么称
为反素数。
从反素数的定义中能够看出两个性质:
(1)一个反素数的全部质因子必定是从2開始的连续若干个质数。由于反素数是保证约数个数为的这个数
尽量小
(2)相同的道理,假设,那么必有
个人理解性证明:
对(1)如果不是从2開始,那么如果n的最小素因素是k,把k换成2,2的次数仍等于k的次数,得到N,可知,N<n,而且f(n)==f(N)。与n是反素数矛盾
对(2)如果ti<tj ti,tj各自是是质因数i,j的次数,i<j。那么将i的次数换成tj,j的次数换成ti 能够得到N 。满足N<n且f(n)==f(N),与n是反素数矛盾
综上,两条性质得证
可能会疑惑,反素数的性质有个毛用!?
答案是:剪枝
先来一份TLE代码(2000ms+)
const int SIZE = 16;
const int MAXN = 65;
int p[SIZE] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; ll n,ans,ansnum;
void dfs(int dep, ll tmp , ll mx)
{
if(tmp<=n)
{
if(mx>ansnum)
{
ans=tmp;
ansnum=mx;
}
if(mx==ansnum)ans=min(tmp,ans);///
}
if(tmp>=n || dep>SIZE-1)return;
ll tt=1;
for(int i=0;i<SIZE;i++)
{
if(n/tt<tmp)break;
dfs(dep+1,tmp*tt,mx*(i+1));
tt*=p[dep];
}
} int main()
{
//IN("zoj1562.txt");
while(~scanf("%lld",&n))
{
ans=ansnum=0;
dfs(0,1,1);
printf("%lld\n",ans);
}
return 0;
}
TLE的原因是dfs太多,剪枝方法非常easy。
1、DFS的时候,是从小的素数開始,由性质1,必须是次数从1開始而不是0開始。这样就剪下了一块
2、DFS的时候,深度为dep的那一层,循环处理的是prm[dep]的i次方,那么由性质2。其上限不能超过上一层的次数,又零零碎碎剪下了不少
另外注意两点:
1、由于害怕超过long long 所以用除法
if(n/tt<tmp)break;
2、注意求反素数这行代码:(是为了满足定义)
<pre code_snippet_id="457113" snippet_file_name="blog_20140824_2_8087056" name="code" class="cpp">if(mx==ansnum)ans=min(tmp,ans);
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
const int SIZE = 16;
const int MAXN = 65;
int p[SIZE] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; ll n,ans,ansnum;
void dfs(int dep, ll tmp , ll mx,int num)
{
if(tmp<=n)
{
if(mx>ansnum)
{
ans=tmp;
ansnum=mx;
}
if(mx==ansnum)ans=min(tmp,ans);///
}
if(tmp>=n || dep>SIZE-1)return;
ll tt=1;
for(int i=1;i<num;i++)
{
tt*=p[dep];
if(n/tt<tmp)break;
dfs(dep+1,tmp*tt,mx*(i+1),i+1);
}
} int main()
{
//IN("zoj1562.txt");
while(~scanf("%lld",&n))
{
ans=ansnum=0;
dfs(0,1,1,MAXN);
printf("%lld\n",ans);
}
return 0;
}
zoj 1562 反素数 附上个人对反素数性质的证明的更多相关文章
- 反调试手法之CreateProcess反调试
反调试手法之CreateProcess反调试 在学习Win32 创建进程的时候.我们发现了有一个进程信息结构体. STARTUPINFO. 这个结构体可以实现反调试. 具体CreateProcess可 ...
- 常见的反爬措施:UA反爬和Cookie反爬
摘要:为了屏蔽这些垃圾流量,或者为了降低自己服务器压力,避免被爬虫程序影响到正常人类的使用,开发者会研究各种各样的手段,去反爬虫. 本文分享自华为云社区<Python爬虫反爬,你应该从这篇博客开 ...
- C# 练习题 判断1至输入数值之间有多少个素数,并输出所有素数。
题目:判断1至输入数值之间有多少个素数,并输出所有素数.1.程序分析:判断素数的方法:用一个数分别去除2到当前数-1,如果能被整除,则表明此数不是素数,反之是素数. class Program { / ...
- python基础练习题(题目 判断101-200之间有多少个素数,并输出所有素数。)
day7 --------------------------------------------------------------- 实例012:100到200的素数 题目 判断101-200之间 ...
- BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: i ...
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...
- POJ 1562 Oil Deposits (HDU 1241 ZOJ 1562) DFS
现在,又可以和她没心没肺的开着玩笑,感觉真好. 思念,是一种后知后觉的痛. 她说,今后做好朋友吧,说这句话的时候都没感觉.. 我想我该恨我自己,肆无忌惮的把她带进我的梦,当成了梦的主角. 梦醒之后总是 ...
- 【Python3爬虫】反反爬之解决前端反调试问题
一.前言 在我们爬取某些网站的时候,会想要打开 DevTools 查看元素或者抓包分析,但按下 F12 的时候,却出现了下面这一幕: 此时网页暂停加载,也就没法运行代码了,直接中断掉了,难道这就能阻止 ...
- 【Python3爬虫】突破反爬之应对前端反调试手段
一.前言 在我们爬取某些网站的时候,会想要打开 DevTools 查看元素或者抓包分析,但按下 F12 的时候,却出现了下面这一幕: 此时网页暂停加载,自动跳转到 Source 页面并打开了一个 ...
随机推荐
- sqlite insert select 联合使用
insert into encoder_config (name,value,chengji,parents) select name,value,chengji,parents from media ...
- #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- linux系统编程:守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- Orchard运用 - 定制博客分页显示
一般,对于条目过多的系统或博客,分页显示是最简单的方式.目前分页方式基本有三种格式: 1.显示所有信息,包括标明当前页面,提供上一页和下一页链接和使用首页和末页链接. 2.只标注上一页和下一页链接. ...
- vue项目中使用mockjs模拟接口返回数据
Mock.js 是一个模拟数据生成器,利用它,可以拦截ajax请求,直接模拟返回数据,这样前后端只要约定好数据格式,前端就不需要依赖后端的接口,可以直接使用模拟的数据了. 网上介绍mock的教程也较多 ...
- Android -- 图像处理(信息量超大)
Android的图像处理提供的API很帮,但是不适合用来写游戏,写游戏还是用专门的引擎比较好. Android的图像处理还有3D的处理的API,感觉超屌. 我先分享一下Android的一般的处理,比如 ...
- 转:如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书
转自:http://blog.k-res.net/archives/1539.html 如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书 六月 11, 2 ...
- 转:Tortoise SVN 版本控制常用操作知识
转自:http://www.cnblogs.com/csharp4/archive/2010/11/26/1889317.html 今天老大跑过来问我如何把SVN服务器上的当前版本回退到某一个版本上去 ...
- [Grunt] Development Automation Tasks with Grunt
With Grunt you can automate core tasks for your AngularJS project. In this lesson we will take a loo ...
- div+css 和 xhtml+css是一回事么?
div+css 和 xhtml+css是一回事.只是说法不一样,表达得意思都是通过CSS定义DIV 布局. 那为什么地方要说成XHTML +css 呢? 以为我们做网站用CSS布局得时候不光是用了DI ...