zoukankan      html  css  js  c++  java
  • 洛谷 [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}}$$, 其中$0leq b_i leq c_i$ $N$ 的正约数个数可表示为: $$ (c_1 + 1) * (c_2 + 1) * cdots *(c_m + 1) = prod_{i=1}^mquad(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);return 0;}
    	int k = 0;
    	for( ; (1ll<<k) < n && k <= 30; k++) ;
    	dfs(1, 1, 1, k);
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    数据库系统原理:范式理论
    数据库系统原理:MVCC
    数据库系统原理:悲观锁、乐观锁
    数据库系统原理:封锁
    数据库系统原理:四大隔离级别
    数据库系统原理:ACID的作用以及实现原理
    计算机网络HTTP:长连接与短连接
    计算机网络HTTP:HTTP缓存
    计算机网络HTTP:状态码
    yum安装Docker
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8524682.html
Copyright © 2011-2022 走看看