题目链接 http://114.215.99.34/#/enter/problem?pid=1171
线性筛约数个数
分质数、最小质因子指数不为1和最小质因子指数为1的情况讨论,
除了维护每个数的约数个数的数组d,每个数最小质因子指数的数组t(最小的原因是每个合数都被它最小的素数因子筛去)
n = a1^b1 + a2^b2 + ... + ak^bk
d(n) = (b1+1) * (b2+1) * ... * (bk+1)
【若是质数,则约数个数为2(1和它本身),t数组为1】
【若是最小质因子指数不为1,则存为d[i*prime[j]]=d[i]/(t[i]+1)*(t[i]+2),t存为t[i]+1】
【若是最小质因子指数为1,则存为d[i*prime[j]]=d[i]*2,t存为1】
#include<stdio.h>
#include<string.h>
#define maxn 2000005
int d[maxn]; //i的约数个数
int t[maxn]; //i的最小素约数的指数
int vis[maxn]; //是否为素数,0表示是素数,1表示不是
int prime[maxn]; //素数
void pre()
{
int i, j;
memset(vis, 0, sizeof(vis));
memset(d, 0, sizeof(d));
memset(t, 0, sizeof(t));
vis[1] = 1;
int cnt = 0; //素数个数
for(i = 2; i < maxn; i++)
if(!vis[i])
{
//此时i是素数
prime[cnt++] = i;
for(j = 2 * i; j < maxn; j+=i)
{
vis[j] = 1;
}
}
d[1] = 1;
for(i = 0; i < cnt; i++)
{
int p = prime[i];
d[p] = 2; //素数的约数个数为2
t[p] = 1; //素数的约数指数为1
for(j = 2; j * p < maxn; j++)
{
if(j % p == 0)
{
d[j * p] = d[j] / (t[j]+1) * (t[j]+2);
t[j * p] = t[j] + 1;
}
else{
d[j * p] = d[j] * (1 + 1);
t[j * p] = 1;
}
}
}
}
void solve()
{
int a, b, ans = 0;
scanf("%d %d", &a, &b);
int x = 0;
for(int i = a; i <= b; i++)
{
if(d[i] > ans) ans = d[i], x = i;
//
//printf("d[%d] = %d\n", i, d[i]);
//
}
printf("%d\n", ans);
}
int main()
{
pre();
solve();
return 0;
}