约数的个数 + 贪心

摘要:
一定要以除法的形式写出来。乘法将爆炸longlongx*=a[k];cnt++;ifbreak;dfs;}}intmain(){//freopen;//freopen;llt;//init();cin˃˃t;而(t--){cin˃˃n;ans=1;dfs;printf;}return0;}当数据太大时,你必须认为它可能会超出长范围。此时,有些关系可以通过除法来解决,所以尽量不要使用乘法!!

链接:https://www.nowcoder.com/acm/contest/82/A
来源:牛客网

题目描述

t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数

输入描述:

第一行一个正整数t
之后t行,每行一个正整数n

输出描述:

输出t行,每行一个整数,表示答案
示例1

输入

5
13
9
1
13
16

输出

6
4
1
6
6

备注:

对于100%的数据,t <= 500 , 1 <= n <= 1000000000000000000

题意 :给你一个 n ,询问 从 1 到 n 约数个数最多的数的约数个数是几个。
思路 :首先能想到的暴力肯定是不可解的, n 太大了
  在数学上有一个叫约数定理的东东,任意一个数可以写成一些质因子幂次的乘积,x = p1^a1*p2^a2*p3^a3 , 那么约数的个数就等于(a1+1)*(a2+1)*(a3+1),
但是呢这个题不能去找每个数的质因数,会超时的,我们可以反着来,通过已知的质因子去寻找比 n 小的数,但是单纯这样还是会超时,我们来看一个12 = 2^2*3 , 18 = 2*3^2 ,
这两个数的约数个数是相同的,如果让选的话优先会挑选小的那个数,观察一下小的数会发现因子小的次幂是偏大的,那么就可以贪心的选取了,下一个数的次幂一定是小于等于当前数的次幂的。
代码示例:
#define ll long long
const ll maxn = 1e6+5;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;

ll n;
ll a[35] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
ll ans;
void dfs(ll x, ll sum, ll k, ll ci){
    ans = max(ans, sum);
    if (k > 19 || ci == 0) return;
    ll cnt = 0;
    while(x <= n/a[k]){  // !!! 一定要写成除的形式,乘的话会爆掉long long
        x *= a[k];
        cnt++;
        if (cnt > ci) break;
        dfs(x, sum*(cnt+1), k+1, cnt);
    }
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    ll t;
    //init();
    
    cin >>t;
    while(t--){
        cin >> n;
        ans = 1;
        dfs(1, 1, 0, 35);
        printf("%lld
", ans);
    }
    return 0;
}

在数据偏大的时候一定要想着可能会超 long long ,那么这时候有些关系能用除解决,就尽量不要用乘的!!

免责声明:文章转载自《约数的个数 + 贪心》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【spring mvc】spring mvc POST方式接收单个字符串参数,不加注解,接收到的值为null,加上@RequestBody,接收到{"uid":"品牌分类大”},加上@RequestParam报错 ---- GET方式接收单个参数的方法js 把对象按照属性名的字母顺序进行排列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

echarts基本应用-更改坐标轴文字样式、轴名称、轴刻度、轴线、轴网格、曲线(折线图)、柱体上面显示值(柱状图),鼠标悬浮提示

让我根据这些天的需要总结一些常用文档。1.axisLabel:{axis text,show:true在xAxis或yAxis根下,textStyle:{color:“#333”,//更改坐标轴文本颜色fontSize:12//更改坐标轴文字大小}}2.grid:{图标到周围区域的距离,包括顶部、左侧、右侧和引导,可以是100%left:“1%”right:...

C#探秘系列(十)WPF:打开文件选择器选择文件并保存

//此为点击按钮的监听事件,点击按钮弹出文件选择器privatevoidimageButton_Click(objectsender,RoutedEventArgse){vardialog=newOpenFileDialog();dialog.Filter=".jpg|*.jpg|.png|*.png|.jpeg|*.jpeg";if(dialog.Show...

【01】如何在XMind中排列自由主题

如何在XMind中安排免费主题。在XMind思维导图软件中,用户可以根据需要添加免费主题。然而,由于自由主题的灵活性,它并不整洁,与需要控制界面有序排列的用户相比,这会造成一定的麻烦。首先选择要组织的所有免费主题,单击,然后在下拉框中选择以安排免费主题。有六种排列方式:左对齐、垂直居中、右对齐、顶部对齐、水平居中和底部对齐。...

SpringBoot源码深度解析

Spring开源框架解决了企业开发的复杂性,简化了AOP的开发,IOCSpring配置越来越多,不易管理==如何自动配置Springboot,核心原则!Java领域最流行的技术!公司,如何演变结构!...

java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC

主要用于西门子PLC的M、Q、I、DB块的数据读写。该组件支持快速建立高性能Modbus TCP终端。对于日志记录,暂时只保留接口。具体来说,您可以为该组件支持的西门子通信实现两种协议。一种是S7协议,它几乎不需要PLC侧的参数配置。另一个是Fetch/Write协议,它有点麻烦。如果S7不方便阅读,您可以选择“获取/写入”。S7更方便。...

SPEC CPU——简介和使用

前言SPECCPU是一个行业标准的CPU密集型基准套件。SPEC设计此套件是为了使用真实用户应用程序开发的工作负载,在最广泛的真实硬件范围内提供计算密集型性能的比较度量。SPECCPU2006和SPECCPU2017表明SPECCPU2006是2006年6月推出的基准测试套件。它有几种不同的方法来测量计算机性能。...