广师OJ1171最多约数个数 解题报告

题目链接 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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值