磊哥的密码箱(唯一分解定理+暴力)

磊哥的密码箱(唯一分解定理+暴力)

题目描述

磊哥有个密码箱,里面装的都是令磊哥羞羞的东西。
箱子的密码是[1,n]里面的约数最多的数的约数数目。
磊哥的女朋友想知道磊哥到底装的是什么东西?她需要你的帮助。

输入

输入一个整数T,表示有T个测试数据
下面T行,每行输入一个正整数n。

输出

对每个n,输出对应一行一个正整数表示[1,n]里最多约数的数的约数个数。

样例输入

复制样例数据

2
13
9

样例输出

6
4

提示

100%的数据满足:1 ≤ n ≤ 1,000,000,000,000,000,000.

ps:用分解定理。 n分解为:p1^a1p2^a2…pk^ak 约数个数为: (a1+1)(a2+1)…*(ak+1) ,然后暴力dfs.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;



ll qpow(ll b,ll a){

    ll ans=1;

    while(a--){

        ans*=b;

    }

    return ans;

}

ll ans;

ll n;

ll a[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};//最差的情况这些质数相乘大于题目的范围了。

void dfs(ll p,ll res,ll s,ll l){

    if(s>n) return;

    ans=max(ans,res);

    for(ll i=1;i<=l;i++){

        ll t=qpow(a[p],i);

        if(s>n/t) return;//注意这里不能s*t>n,s*t会爆ll.

        dfs(p+1,res*(i+1),s*t,i);

    }

}

int main()

{

    int t;

    cin>>t;

    while(t--){

        ans=0;

        scanf("%lld",&n);

        dfs(1,1,1,30);

        printf("%lld\n",ans);

    }

    return 0;

}

你可能感兴趣的:(磊哥的密码箱(唯一分解定理+暴力))