51nod 最复杂的数(反素数)

来源:互联网 发布:乐清知临寄宿学校招聘 编辑:程序博客网 时间:2024/06/05 09:39

定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数·

约数个数定理:

其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。 
 这句话的意思就是如果一个数 n = a1^x1 * a2^x2 * a3^x3 *..... * ak^xk, 那么它的约数个数为ex-phi(n) = (x1+1)(x2+1).....(xk+1).

 我们假设n的范围在10^18次方内,那么最多有16个质因子.即2*3*5*7*11*13*17*19*23*29*.....5310^19 > 10^18

1.给一个数,求一个最小的正整数,使得它的因子个数为。(这里涉及约数个数定理,例如:num*(i+1))

#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>#include<cctype>#include<cmath>#include<ctime>#include<string>#include<stack>#include<deque>#include<queue>#include<list>#include<set>#include<map>#include<cstdio>#include<limits.h>#define MOD 1000000007#define fir first#define sec second#define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin)#define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout)#define mes(x, m) memset(x, m, sizeof(x))#define Pii pair<int, int>#define Pll pair<ll, ll>#define INF 1e9+7#define Pi 4.0*atan(1.0)#define lowbit(x) (x&-x)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long ll;typedef unsigned long long ull;const double eps = 1e-7;const int MAX = 101;using namespace std;//#define timeint prime[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};int n;ull ans;//int limit;inline void dfs(int k, ull sum, int num)//第k大素因子,sum表示当前数的值,num表示约数个数{    if(num > n){          return;    }    if(n == num && ans > sum){ //sum所表示的是因子等于所给因子数n,则跟新当前最小正整数值。       ans = sum;    }    for(int i = 1; i < 64; ++i){        if(ans/prime[k] < sum){   //<span style="font-family: Arial, Helvetica, sans-serif;">sum*prime[k] > ans可能会爆,改成除法可以避免</span>            break;        }        dfs(k + 1, sum *= prime[k], num*(i+1));    }}/*int log2(ull n){    int count = 0;    ull p = 1;    while(p < n){        p <<= 1;        ++count;    }    return count;}*/int main(){    while(cin >> n){        ans = ULLONG_MAX; //取unsigned long long最大值或者可以写成ans=~0ULL        dfs(0, 1, 1); //深搜        cout << ans << endl;    }    return 0;}

把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。
例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 100)第2 - T + 1行:T个数,表示需要计算的n。(1 <= n <= 10^18)
Output
共T行,每行2个数用空格分开,第1个数是答案,第2个数是约数的数量。
Input示例
5110100100010000
Output示例
1 16 460 12840 327560 64

等同于求出中约数个数最多的最小正整数

#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>#include<cctype>#include<cmath>#include<ctime>#include<string>#include<stack>#include<deque>#include<queue>#include<list>#include<set>#include<map>#include<cstdio>#include<limits.h>#define MOD 1000000007#define fir first#define sec second#define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin)#define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout)#define mes(x, m) memset(x, m, sizeof(x))#define Pii pair<int, int>#define Pll pair<ll, ll>#define INF 1e9+7#define Pi 4.0*atan(1.0)#define lowbit(x) (x&-x)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long ll;typedef unsigned long long ull;const double eps = 1e-7;const int MAX = 101;using namespace std;//#define timeint prime[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};ull n;ull ans;int maxSum;//int limit;inline void dfs(int k, ull sum, int num, int limits) //第k大素因子,当前值,约数个数,上一个素因子的个数{    if(k >= 16){        return;    }    if(num > maxSum){        maxSum = num;        ans = sum;    }    if(maxSum == num && sum < ans){        ans = sum;    }    for(int i = 1; i <= limits; ++i){        if(n/prime[k] < sum){              break;        }        dfs(k+1, sum*=prime[k], num*(i+1), i);    }}int log2(ull n){  //取2最大幂次  当前最大是2^63,即limits最大是63     int count = 0;    ull p = 1;    while(p < n){        p <<= 1;        ++count;    }    return count;}int main(){   // fin;    int T;    cin >> T;    while(T--){        cin >> n;        ans = ULLONG_MAX;  //设置最大值        maxSum = 0;        dfs(0, 1, 1, log2(n));        cout << ans << " " << maxSum << endl;    }    return 0;}


0 0