题目大意:找出T组不大于ni(i=1,2,3,...,T)的因子数最多的数mi(i=1,2,3,...,T),有多个数时输出最小的。

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

数据规模:1<=T=100,1<=ni(i=1,2,3,...,T)<=10^18。

理论基础:定理:如果:m=p1^k1*p2^k2*...那么:m的因子数=(k1+1)*(k2+1)*...。

题目分析:由定理可以知道,我们如果:(p1<p2<p3<...)且(k1>=k2>=k3>=...)且m不超过n,则m即为所求的解。

可知解为m不超过ns时素因子个数最多的情况下,小素数的指数尽可能多的情况,且达到最多素数时,假设,已知所有的素数的积为m,则问题转化为子结构:不超过n/m的情况下,求一个因子最多的最小数问题。这个我们直接深搜就可以了。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
typedef long long unsigned LU;
LU n,num,cnt;
int T,p[17]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51};
void dfs(LU now,int dep,LU pdt,int bor)
{
LU i;
int j,pdtt,t;
if(dep==16)return;
if(pdt>cnt||(pdt==cnt&&now<num))
{
num=now;
cnt=pdt;
}
j=0,t=1,i=now;
while(j<bor)
{
j++;
t++;
if(n/i<p[dep])break;
pdtt=pdt*t;
if(i<=n/p[dep])
{
i=i*p[dep];
dfs(i,dep+1,pdtt,j);
}
else break;
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%I64u",&n);
if(n==1)
{
printf("1 1\n");
continue;
}
num=1,cnt=1;
dfs(1,1,1,60);
printf("%I64u %I64d\n",num,cnt);
}
return 0;
}

其中,dfs即为深搜的一个函数。可经过预先计算得知深度不会超过16所以我们将前16个素数处理出来,已经足够了。

参考文献:

http://baike.baidu.com/view/1780622.htm

by:Jsun_moon http://blog.csdn.net/Jsun_moon

URAL 1748的更多相关文章

  1. ural 1748 The Most Complex Number 和 丑数

    题目:http://acm.timus.ru/problem.aspx?space=1&num=1748 题意:求n范围内约数个数最多的那个数. Roughly speaking, for a ...

  2. URAL 1748. The Most Complex Number(反素数)

    题目链接 题意 :给你一个n,让你找出小于等于n的数中因子个数最多的那个数,并且输出因子个数,如果有多个答案,输出数最小的那个 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. ( ...

  3. URAL 1748 The Most Complex Number

    题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...

  4. 1060 最复杂的数(反素数玄学dfs)

    1060 最复杂的数 题目来源: Ural 1748 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中 ...

  5. 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome

    题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...

  6. ural 2071. Juice Cocktails

    2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...

  7. ural 2073. Log Files

    2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...

  8. ural 2070. Interesting Numbers

    2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...

  9. ural 2069. Hard Rock

    2069. Hard Rock Time limit: 1.0 secondMemory limit: 64 MB Ilya is a frontman of the most famous rock ...

随机推荐

  1. ubuntu18.04 安装Navicat 解决字体方框问题

    前景 最近带着看一点数据库的知识,装一下navicat,就是这个玩意儿,在我编码毫无问题的情况下,这个软件上却显示各种乱码 环境 ubuntu 18.04 navicat 12(最新版) mysql ...

  2. Needed Learning(Updating)

    决定把掌握不熟练或是模型见的少的知识点在这里列一列 希望能在自己AFO前成功get技能点吧…… 优先级:动态规划-分治-字符串-图论-数据结构-数学-计算几何-其它 动态规划 1.四边形不等式优化 2 ...

  3. BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)

    题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...

  4. 【线性基】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem A. XOR

    题意:给你一些数,问你是否能够将它们划分成两个集合,使得这两个集合的异或和之差的绝对值最小. 设所有数的异或和为S,集合A的异或和为A. 首先,S的0的位对答案不造成影响. S的最高位1,所对应的A的 ...

  5. Metasploit小技巧

    meterpreter > 进入meterpreter之后即可进行一些相关木马操作了,下面是正式本章内容 首先可以查看帮助文档,命令“help”,挑常用操作来讲↓↓↓ ------------- ...

  6. 【BZOJ】4318: OSU!【期望DP】

    4318: OSU! Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 1174[Submit][Status][Discuss ...

  7. 【洛谷】1494:[国家集训队]小Z的袜子【莫队】

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

  8. 【Codeforces 949D】Shake It! 【动态规划】

    参考: http://blog.csdn.net/gjghfd/article/details/77824901 所求的是满足条件的图中“不同构”的数量,意味着操作的顺序是可以忽略的.考虑若干次操作后 ...

  9. Dijkstra_Liu博客100篇祭

    创建博客,有两年三个月了.今天,写了100篇随笔了,又正值我的15岁生日,还是值得纪念一下. 两年过去了,我从学习:队列.栈.模拟.背包慢慢地变成了:Tarjan.线段树.树剖. 我也从一个初一的天真 ...

  10. PYQT窗口托盘目录

    #UI.py,通过UI设计师制作后直接转换为UI.py脚本 # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try:    _fromU ...