LightOJ 1336

这道题实在是有些精彩

求 1- n 内因子和为偶数的数字的 个数

那么我们就有思路了虽然题目里给了求因子和公式

但是由于之前我们自学,我们知道这个公式最原始的样子

Sum = (1 + p1^1 + p1^2 + ... pn^a1) * .........

题目里给的全是等比数列求和公式优化后的式子

首先我们需要了解一个东西, 偶数个奇数相加之和是偶数,奇数个奇数相加之和是奇数。。

证明的话可能比较。。粗糙:

我们知道两个奇数之和必定为 偶数了,那么如果偶数个相加不就是。。多个两个奇数相加吗。。而偶数加偶数必定是奇数,奇数加偶数必定是偶数,,,所以如果是奇数个奇数相加,我们拿出一个奇数,剩下的是偶数个奇数相加 为偶数,最后加上这个奇数,最终结果就是 奇数了。

那么这条规律我们先暂时放下,但是记住。

我们发现对于乘法而言 奇数乘以奇数才为奇数(奇数个奇数相加),我们知道素数里 只有 2 是偶数,而对于前 n 项和公式,我们知道 2 那一部分必定为 奇数(化简到最后为 2^n - 1) 所以可以知道 2^x 这些数字因子和必为奇数

对于公式 X = p1^a1 * p2^a2 *..... pn^an

那么对于其他项, Sum = S(p1) + S(p2) + S(p3),..... p2 p3 ----pn 都必定为 奇数同时我们知道 p^n 也一定为奇数(奇数乘以奇数仍为奇数)那么 对于每个素数 p 一共有 a+1个奇数相加 ,如果 S 想为奇数, a+1 必定得是奇数,得出 a 必定得为 偶数

那么如果 a 为偶数,那么我们知道这个数必定可以由 p2^2(或者 (p2^2) ^ 2 ) 作为因子,也就是平方数因子和必定为奇数

但是别忘了 如果 p1 = 2 的时候也得算上,所以任意的平方数 * 2 因子和也是奇数

这样我们可以不用去管 2^k 因为 2^k 可以分解成 2* 某个平方数。

综上 最终结果就是 n - sqrt( n ) - sqrt( n/2 )

 

 

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
	ll n;
	int t,cas = 1;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld",&n);
		ll a = sqrt(n);
		ll b = sqrt(n/2);
		printf("Case %d: %lld\n",cas++,n-a-b);
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值