列表

详情


NC15428. n的约数

描述

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

输入描述

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

输出描述

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

示例1

输入:

5
13
9
1
13
16

输出:

6
4
1
6
6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 315ms, 内存消耗: 616K, 提交时间: 2019-05-31 21:02:14

#include<cstdio>
#include<cmath>
typedef long long ll;
const ll a[50]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47};
ll ans,n;
void dfs(int p,int pre,ll num,ll x)
{
	if(num>ans)
		ans=num;
	for(int i=1;i<=pre&&x<=n/a[p];i++)
	{
		x*=a[p];
		dfs(p+1,i,num*1ll*(i+1),x);
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld",&n);
		ans=1ll;
		dfs(0,63,1ll,1ll);
		printf("%lld\n",ans);
	}
	return 0;
}

C++(clang++11) 解法, 执行用时: 99ms, 内存消耗: 392K, 提交时间: 2020-10-30 20:47:46

#include<bits/stdc++.h>
using namespace std;
long long n,t,ans,T[105]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
void DFS(int x,long long s,__int128 sum,int MAX)
{
	ans=max(ans,s);
	for(int i=1;i<=MAX&&sum*T[x]<=n;i++)
	{
		sum*=T[x];
		DFS(x+1,s*(i+1),sum,i);
	}
}
int main()
{
	cin>>t;
	while(t--)
	{
		scanf("%lld",&n);
		ans=0,DFS(0,1,1,1e9);
	    printf("%lld\n",ans);
	}
}

上一题