Sigma Function LightOJ - 1336(唯一分解定理,因数之和性质)

Sigma Function LightOJ - 1336 (唯一分解定理,因数之和性质)

题意:给一个n,输出 [ 1 , n ] [1,n] [1,n] 中每一个数的因数之和为偶数的数的个数之和。

思路:

方法一:打表找规律

打表代码

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

long long n;

int main() {
	scanf("%lld", &n);
	for(int k = 1;k <= n; k++) {
		long long sum = 0;
		for(int i = 1;i <= sqrt(k); i++) {
			if(k%i==0) {
				sum += i;
				if(i != k/i) sum += k/i;
			} 
		}
		printf("%d %d\n", k, sum%2==0);
	}
}

通过对1000(或者100)以内就可以发现因数之和为奇数的数一般都是平方数或者是平方数的两倍,就可以写代码了。

方法二:

通过唯一分解定理的一个性质可以知道一个数的因数之和为

f ( x ) = ( p 1 0 + p 1 1 + p 1 2 + . . . + p 1 a 1 ) ∗ ( p 2 0 + p 2 1 + p 2 2 + . . . + p 2 a 2 ) ∗ . . . ∗ ( p n 0 + p n 1 + p n 2 + . . . + p n a n ) f(x) = (p1^0+p1^1+p1^2+...+p1^{a1})*(p2^0+p2^1+p2^2+...+p2^{a2})*...*(pn^0+pn^1+pn^2+...+pn^{an}) f(x)=(p10+p11+p12+...+p1a1)(p20+p21+p22+...+p2a2)...(pn0+pn1+pn2+...+pnan)

我们要使这个数为奇数需要什么条件,当然是要把括号里面的每一项都凑成奇数,这样 f ( x ) f(x) f(x) 才为奇数那么怎么样才可以成为奇数呢;由于所有的p都是质数,那么当然需要分类思考一下2跟其他质数,可以知道2的多少次幂都是偶数然后加上最前面的1就变成了奇数,所以x的因数里面有2是不影响x的因数为奇数的;其次再来看一下其他的质数,除去最前面的1, a i ai ai 必须为偶数才可以为偶数,再加上1的话就为奇数,如果所有的 a i ai ai 都为偶数,那么是不是可以分为两份,也就是x是一个平方数,并且有前面可以知道这个数有2这个因数的话也是没得影响的,所以为平方数的2次幂倍都是可以的,也就得到了之前打表的结论。代码很简单。

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

int _, cas;
long long n;

int main() {
	scanf("%d", &_);
	while(_--) {
		scanf("%lld", &n);
		printf("Case %d: ", ++cas);
		printf("%lld\n", n-(long long)sqrt(n)-(long long)(sqrt(n/2)));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值