反素数
Posted sweatOtt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反素数相关的知识,希望对你有一定的参考价值。
反素数的定义: 对于任何的正整数n,其约数的个数记为f(n),例如f(6) = 4,如果某个正整数n满足,对于任意正整数i,0<i<n都有f(i)<f(n)那么称n为反素数。
两个性质:
(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为的这个数尽量小
(2)同样的道理,如果,那么必有
根据这2个性质可以找到反素数。可以用搜索来查找。
模板:
#include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define INF 1000000001 #define ll unsigned long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int MAXN = 510; int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,53,59,61,67}; ll n; ll ans,ans_cnt; void getarcprime(ll cur,ll cnt,int limit,int k) { if(cur > n)return; if(cnt > ans_cnt){ ans_cnt = cnt; ans = cur; } else if(cnt == ans_cnt && cur < ans){ ans = cur; } for(int i = 1; i <= limit; i++){ if(n / prime[k] < cur){ return; } getarcprime(cur*prime[k],cnt*(i+1),i,k+1);//性质二 cur = cur*prime[k]; } } int main() { int t; cin >>t; while(t--){ cin >>n; ans = 0; ans_cnt = 0; getarcprime(1,1,60,0); cout<<ans<<" "<<ans_cnt<<endl; } return 0; }
以上是关于反素数的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 1053 1053: [HAOI2007]反素数ant (反素数)