lightoj 1336 Sigma Function

本文介绍了一种快速计算方法,用于找出1到n区间内所有数x,使得x的所有因子之和为偶数的数量。通过分析仅2x, x2, 和2*x2的情况,提出了一种高效的解决方案。

题目大意:

  δ(n)表示n的所有因子的和,给一个数n,求[1,n]之间的数x,满足δ(x)是偶数的x有多少个。

解题思路:

  想来想去,没有思路,只感觉和2这个因子有关,看大家都做出来了,感觉题目不应该太难,于是打标看了看,发现只有2x,x2,2*x2的因子不是偶数,只需要算出来然后减去重复的就ok:

  2x/x2:可以换算出,当x是偶数的时候,两者重复。

  2x/2*x2:当x是奇数的时候,两者重复。

所以最后的结果就是n减去x2和2*x2的个数。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 int main ()
 9 {
10     long long t, n, l = 1;
11     scanf ("%lld", &t);
12     while (t --)
13     {
14         scanf ("%lld", &n);
15         long long t1, t2;
16         t1 = (long long)sqrt(n);//x^2的个数
17         t2 = (long long)sqrt(n/2);//2*x^2的个数
18         printf ("Case %lld: %lld\n", l++, n - t1 - t2);
19     }
20     return 0;
21 }

 

转载于:https://www.cnblogs.com/alihenaixiao/p/4459793.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值