打表练习题——反素数

题目描述

如果一个自然数比所有比它小的自然数的约数个数都要多,那么我们就称这个数为一个反素数。例如,1、2、4、6、12和24都是反素数。
任务:
请写一个程序:
读入一个自然数n;
找出不大于n的最大的反素数;
将结果输出。

本题需要用到的知识:约数个数定理

代码(不会打表没逼逼)

//By Bibi
///                 .-~~~~~~~~~-._       _.-~~~~~~~~~-.
///             __.'              ~.   .~              `.__
///           .'//                  \./                  \\`.
///        .'//                     |                     \\`.
///       .'// .-~"""""""~~~~-._     |     _,-~~~~"""""""~-. \\`.
///     .'//.-"                 `-.  |  .-'                 "-.\\`.
///   .'//______.============-..   \ | /   ..-============.______\\`.
/// .'______________________________\|/______________________________`.
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const int N=500;
int read(){
    int sum=0,flag=1;
    char c;
    for(;c<'0'||c>'9';c=getchar())if(c=='-') flag=-1;
    for(;c>='0'&&c<='9';c=getchar())sum=(sum<<1)+(sum<<3)+c-'0';
    return sum*flag;
}
int prime[20]={-1,2,3,5,7,11,13,17,19,23,29,31,37};
int maxid;
int n;
int p[N]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,554400,665280,720720,1081080,1441440,2162160,2882880,3603600,4324320,6486480,7207200,8648640,10810800,14414400,17297280,21621600,32432400,36756720,43243200,61261200,73513440,110270160,122522400,147026880,183783600,245044800,294053760,367567200,551350800,698377680,735134400,1102701600,1396755360,2001000000};
ll ans1;
ll ans2;
void init(){
    n=read();
}
void work1(){
    rep(i,1,500){
        if(p[i]>n) {ans1=p[i-1];break;}
    }
}
void work2(long long now,int d,int tot){
    if(d>maxid||(d==maxid&&now<ans2)) ans2=now,maxid=d;
    if(tot>12) return;
    ll a=1;
    rep(i,0,30){
        if(a*now>n) break;
        work2(now*a,d*(i+1),tot+1);
        a*=prime[tot];
    }
}
int main(){
    init();
    work1();
    work2(1,1,1);
    if(ans1==ans2) printf("%lld\n",ans1);
    else printf("不会打表别逼逼……");
    return 0;
}
/*
根据反素数的定义和约数个数定理很容易证得反素数的质因子质数为严格不下降序列,20亿的数据不过12个质数连乘,20亿以内的反素数也就几十个开个calc手打都能打出来。难道不是打表练习题????

ps:不会打表别逼逼……
*/

猜你喜欢

转载自blog.csdn.net/bbbblzy/article/details/79952758