n的约数(dfs)


题目描述

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

输入描述:

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

输出描述:

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


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

思路:

1:直接暴力会超出时间。

2:任何一个数p=质数的乘积;

3:p=x1^n1*x2^n2*x3^n3等等;

4:p的约数是(n1+1)*(n2+1)*(n3+1)*(n4+1)等等

5:质数不需太大,使用前20位即可。

6:用dfs遍历n就行。

代码:

#include<iostream>

#include<cstring>

#include<cmath>

#include<algorithm>

using  namespace std;

long long prime[21] = { 0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,67,71,73 };

long long int a[25];

int n;

long long int ans;

 int sum;

int dfs(int i,long long int k,int p,int q) {

if (i>20)return 0;

int ret = q;

for (int j = 1; j <= p; j++) {

if (ans / k < prime[i])break;

k = k*prime[i];

ret = max(ret, dfs(i + 1, k, j, q*(j + 1)));

}

return ret;

}

int main() {

cin >> n;

while (n-->0) {

cin >> ans;

sum = 1;

memset(a, 0, sizeof(a));

a[0] = 100000;

cout << dfs(1, 1, 64, 1)<< endl;

}

return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值