LightOJ1236 Pairs Forming LCM 水题?。。


LightOJ1236 Pairs Forming LCM


标签


前言


简明题意

∑ i = 1 n ∑ j = 1 n [ l c m ( i , j ) = n ] \sum_{i=1}^n\sum_{j=1}^n[lcm(i,j)=n] i=1nj=1n[lcm(i,j)=n]


思路

  • 对n质因数分解, n = p 1 c 1 p 2 c 2 . . . p k c k n=p_1^{c1}p_2^{c_2}...p_k^{c_k} n=p1c1p2c2...pkck,由lcm的定义可以知道,ij中,对于每一个 p i p_i pi,都应该有 m a x ( c 1 , c 2 ) = c max(c_1,c_2)=c max(c1,c2)=c,因此,需要让ij中的一个为c,另一个任选,这样就有 2 c + 1 2c+1 2c+1种选法。所以答案就应该是 ∏ ( 2 c i + 1 ) \prod (2c_i+1) (2ci+1)
  • 答案需要a<=b,所以答案需要/2(且要向上取整)

注意事项


总结


AC代码

#include<cstdio>

const int maxn = 1e7 + 10;

bool no_prime[maxn];
int prime[(int)7e5];
int shai(int n)
{
	int cnt = 0;
	no_prime[1] = 1;

	for (int i = 2; i <= n; i++)
	{
		if (!no_prime[i])
			prime[++cnt] = i;

		for (int j = 1; j <= cnt && prime[j] * i <= n; j++)
		{
			no_prime[prime[j] * i] = 1;
			if (i % prime[j] == 0) break;
		}
	}
	return cnt;
}

void solve()
{
	int cnt = shai(maxn - 10);

	int t;
	scanf("%d", &t);
	for (int i = 1; i <= t; i++)
	{
		long long n, r;
		scanf("%lld", &n);
		r = n;

		long long ans = 1;
		for (int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= r && n != 1; i++)
		{
			int cnt = 0;
			while (n % prime[i] == 0)
				n /= prime[i], cnt++;
			ans *= (2 * cnt + 1);
		}
		if (n != 1)
			ans *= 3;

		printf("Case %d: %lld\n", i, (ans + 1) / 2);
	}
}

int main()
{
	freopen("Testin.txt", "r", stdin);
	solve();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值