LightOJ1336(约数和)

题意: 求出 n n n以内约数之和为偶数的数的个数。
数据范围: n ≤ 1 0 12 n\leq 10^{12} n1012

题解: 一个数的约数和公式:
由于 n = p 1 α 1 p 2 α 2 p 3 α 3 . . . p k α k n=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}...p_k^{\alpha_k} n=p1α1p2α2p3α3...pkαk
所以 σ ( n ) = ( 1 + p 1 + p 1 2 + . . . + p 1 α 1 ) . . . ( 1 + p k + p k 2 + . . . + p k α k ) \sigma(n)=(1+p_1+p_1 {}^2+...+p_1{}^{\alpha_1})...(1+p_k+p_k {}^2+...+p_k{}^{\alpha_k}) σ(n)=(1+p1+p12+...+p1α1)...(1+pk+pk2+...+pkαk)
= p 1 α 1 − 1 p 1 − 1 . . . p k α k − 1 p k − 1 =\frac{p_1{}^{\alpha_{1}}-1}{p_{1}-1}...\frac{p_k{}^{\alpha_{k}}-1}{p_{k}-1} =p11p1α11...pk1pkαk1

  • 对于 2 2 2,存在则形成奇数贡献。
  • 对于奇素数,只有 α i \alpha_i αi为奇数时, p i p_i pi的贡献才为偶数。

由于形成偶数的条件太多了,即只要存在一个偶数贡献即可,反向思考形成奇数的条件为所有部分都要为奇数,而形成奇素数贡献为奇数的条件为 α i \alpha_i αi为偶数,奇素数的幂为偶数其必然为完全平方数。
所以直接考虑所有的完全平方数即可,至于考虑 2 2 2的影响则直接完全平方数乘 2 2 2即可,只需乘一个 2 2 2因为乘两个 2 2 2还是完全平方数。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e6 + 10;

int b_s(ll x) {
	int l = 1, r = N - 1;
	while(l < r) {
		int mid = l + r + 1 >> 1;
		if(1ll * mid * mid <= x) l = mid;
		else r = mid - 1;
	}
	return l;
}

int main()
{
	int T; scanf("%d", &T);
	for(int k = 1; k <= T; ++k) {
		ll n; scanf("%lld", &n);
		int r = b_s(n);
		
		int res = r;
		for(int i = 1; i <= r; ++i) {
			if(1ll * i * i * 2 <= n) ++res;
			else break;
		}
		printf("Case %d: %lld\n", k, n - res);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值