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); } }