洛谷 [P1436] 反素数

算术基本定理的应用

算术基本定理:

一个正整数 \(N\) 能唯一分解成如下形式
\[N=p_1 ^ {c_1}p_2^{c_2}\cdots P_m ^ {c_m}\]
其中 \(c_i\) 都是正整数, \(P_i\)都是质数

推论:

\(N\) 的正约数集合可以写成如下形式:
\[ \{p_1^{b_1}P_2^{b_2}\cdots P_m^{b_m}\}\], 其中\(0\leq b_i \leq c_i\)

\(N\) 的正约数个数可表示为:
\[ (c_1 + 1) * (c_2 + 1) * \cdots *(c_m + 1) = \prod_{i=1}^m\quad(c_i + 1)\]

\(N\) 的所有正约数的和可表示为:
\[(1 + p_1 + p_1 ^2 + \cdots p_1 ^ {c_1})* \cdots *(1 + p_m + p_m ^2 + \cdots + p_m ^{c_m}) = \prod_{i =1}^1(\sum_{j = 1}^{c_1}(p_j)^i)\]

首先,对于本题来说,反素数一定是$ 1 \sim N $中约数个数最多的数中最小的一个

其次\(1 \sim N\)的的所有数中,拥有的不相同的质因子不会超过 10 个
每个质因子的幂次不会超过 30

最后我们发现,答案 x 的质因子是连续的若干个质数,且质数单调递减,
如果不是这样的话,我们一定可以通过交换质因子次数的方法,得到一个约数一样,但更小的答案

注意:本题要开 long long

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
ll n, ans, cnt, prime[15] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
void dfs(int k, ll num, ll c, int cur) {
    //cout<<k<<endl;
    if(k == 11 || !cur) {
        if(cnt < c) {ans = num;cnt = c;}
        if(cnt == c) ans = min(ans, num);
        return;
    }
    ll ttt = 1;
    for(int i = 0 ; i <= cur ; i++) {
        if(i) ttt *= prime[k];
        if(num * ttt > n) return;
        dfs(k + 1, num * ttt, c * (i + 1), i);
    }
}
int main() {
    cin>>n;
    if(n == 1) {printf("%lld\n", n);return 0;}
    int k = 0;
    for( ; (1ll<<k) < n && k <= 30; k++) ;
    dfs(1, 1, 1, k);
    cout<<ans<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8524682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值