常用的化简方法(高中就常用了):     p^(e+1)-1/p-1=             [ p^(e+1) -p + (p-1) ]/ (p-1) = p*(p^e-1)/(p-1) + 1   (也可以直接分解p^e-1)

常用的思路:反面验证  比如本题,求偶数(试探后发现不太好求),则推出奇数条件

再看本题。要想让σ(n)为偶数,只要有一项为偶数即可,

化简变为,观察这个式子,pi都是素数,除2以外都是奇数,所以式子奇偶决定于ei,若ei为奇数,就相当于奇数个奇数(若pi不是2,那么肯定是奇数)相加,再加上1,偶数,反之,若ei为偶数,就是奇数。如果pi刚好是2,是奇数

得出结论:对于n,若将n进行唯一分解之后,如果存在任何一个 pi != 2 且 ei ( 1 <= i <= k )为奇数则 σ(n) 为偶数。

现在需要求的是计算1-n之间能让σ(k)为偶数的k的个数。有些复杂,所以考虑这个问题的反面,求1-n之间能让σ(k)为奇数的k的个数

若σ(n)为奇数,则每一项都必须为奇数,意味着每一项约分之后的都必须为奇数,也就是说每一项的ei都必须是偶数,也就是说n必须为平方数。但是前面证明过当pi为2时,无论ei是什么,这一项都是奇数,然而这些平方数乘以2之后,其σ仍是奇数(如果再乘以2,就是另一个平方数了,所以只需要考虑乘一个2),仍然符合条件。

所以n为平方数,或为平方数的2倍,那么σ(n)为奇数。而小于n的平方数为sqrt(n)个,这些平方数的2倍的个数是sqrt(n/2)。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
int T;
scanf("%d", &T);
for(int kase = ; kase <= T; kase++)
{
ll n, sum;
scanf("%lld", &n);
sum = n;
sum -= (int)sqrt(n);
sum -= (int)sqrt(n/);
printf("Case %d: %lld\n", kase, sum);
}
return ;
}

最新文章

  1. Servlet下载文件和http响应
  2. Spring中depends-on的作用是什么?
  3. HDFS简单入门
  4. Shell之date用法
  5. Thinkphp框架----微信公众测试号开发(2)
  6. android中IdleHandler的使用
  7. 在后台对GameObject进行&quot;创建&quot;||&quot;删除&quot;动作
  8. 解读ECMAScript 6箭头函数
  9. 红黑树-Python实现
  10. 获取AJAX加载的内容
  11. Swift基础之对FMDB第三方的使用方法
  12. wireshark使用方法
  13. Pytorch系列教程
  14. ISP PIPLINE (九_2) Denoise 之 time domain denoise
  15. OpenEXR的输出机制
  16. Fit项目分页组件的编写
  17. [转]Struts2多个文件上传
  18. L1-002 打印沙漏
  19. HDUOJ---1712 ACboy needs your help
  20. [svn]显示日志很慢 点击文件查看更改记录也贼慢

热门文章

  1. bzoj 3653 谈笑风生 —— 主席树
  2. Sublime Text3配置自动联想python
  3. 利用高德地图javascriptAPI做一个自己的地图
  4. bzoj4547
  5. 【213】IDL函数汇总
  6. poj3249【拓扑排序】
  7. 跟我一起玩Win32开发(19):浏览和打开文件
  8. net 上传视频
  9. C语言-------指针函数与函数指针的区别
  10. POJ1961(kmp中Next数组的性质)