您的位置:首页 > 编程语言 > C语言/C++

Andrew Stankevich Contest 10 D More Divisors 反素数

2016-09-13 11:31 288 查看
今天学了个新东西,反素数,感觉这玩意主要是套模板。

模板:http://www.cnblogs.com/tiankonguse/archive/2012/07/29/2613877.html

以下套用大牛的讲解。

反素数的定义:对于任何正整数

,其约数个数记为

,例如

,如果某个正整数

满足:对任意的正整

            数

,都有

,那么称

为反素数。

 

从反素数的定义中可以看出两个性质:

 

(1)一个反素数的所有质因子必然是从2开始的连续若干个质数,因为反素数是保证约数个数为

的这个数

尽量小

(2)同样的道理,如果

,那么必有


代码:
#include<bits/stdc++.h>
#define MEM(a,x) memset(a,x,sizeof(a));
#define MEMINF(a) memset(a,0x3f,sizeof(a));
using namespace std;
typedef long long LI;
const int MAXN=205;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
LI n;
LI bestSum,bestNum;
LI prim[15]={2,3,5,7,11,13,17,19,23,29,31,37,43,47};
void getNum(LI num,LI k,LI sum, LI limit) {
if (num>n) return;
if (sum>bestSum) {
bestSum=sum;
bestNum=num;
} else if (sum==bestSum&&num<bestNum) {
bestNum=num;
}
if (k>=13) return ;
for (LI i=1,p=num; i<=limit; ++i) {
if(p*prim[k]>n)break;
p*=prim[k];
getNum(p,k+1,sum*(i+1),i);
}
}

LI log2(LI n) {
LI i=0;
LI p=1;
while (p<n) {
p*=2;
i++;
}
return i;
}

int main() {
freopen("divisors.in","r",stdin);
freopen("divisors.out","w",stdout);
cin>>n;
bestNum=n;
bestSum=0;
getNum(1,0,1,log2(n));
cout<<bestNum<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM C++ 数学