LightOJ 1336 Sigma Function(求1~n的因数和为偶数的个数)
2015-09-10 23:58
302 查看
题意就是给一个数n,然后求1n能分解成所有正因数的和为偶数的个数。
考虑到求所有正因数的和利用到算术基本定理的公式:
/article/2031019.html
稍加分析我们可以知道:
1.p=2的时候,无论ai等于多少,结果总为奇数
2.p≠2的时候,若ai为偶数,则结果为奇数
所以不妨先把所有结果是奇数的情况求出来再用总数减掉可得相应的答案。
求所有结果为奇数的情况,用dfs可以将其全部求出来在累加。
这里普及一种网上大牛的题解:
枚举出 小于n的平方数和 小于n的平方数的两倍。
为什么要求这两种答案,原因在于,当ai为偶数时,结果为奇数,只不过求ai再判断其是否为偶数有点繁琐。举个例子:4*4= (2^2)*(2^2)=2^4,可以看到直接用平方项来代替这个步骤显得更简单。那为什么要枚举小于n的平方数的两倍,是因为当p=2的时候,不会影响奇偶性。
考虑到求所有正因数的和利用到算术基本定理的公式:
/article/2031019.html
1.p=2的时候,无论ai等于多少,结果总为奇数
2.p≠2的时候,若ai为偶数,则结果为奇数
所以不妨先把所有结果是奇数的情况求出来再用总数减掉可得相应的答案。
求所有结果为奇数的情况,用dfs可以将其全部求出来在累加。
这里普及一种网上大牛的题解:
枚举出 小于n的平方数和 小于n的平方数的两倍。
为什么要求这两种答案,原因在于,当ai为偶数时,结果为奇数,只不过求ai再判断其是否为偶数有点繁琐。举个例子:4*4= (2^2)*(2^2)=2^4,可以看到直接用平方项来代替这个步骤显得更简单。那为什么要枚举小于n的平方数的两倍,是因为当p=2的时候,不会影响奇偶性。
[code]#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { long long n; scanf("%lld",&n); long long ans =0; for(int i=1;(long long)i*i<=n;i++) { ans++; if((long long)2*i*i<=n) ans++; } printf("Case %d: %lld\n",cas,n-ans); } return 0; }
相关文章推荐
- Retrofit﹕ java.net.SocketTimeoutException: failed to connect to /IPXXXXXXX
- Unity3d笔记:如何实现不规则多边形按钮
- selenium测试框架使用xml作为对象库
- 9月10日Axure psd笔记
- 微信JSSDK开发JAVA版实现
- C语言在文件中查找字符串是否在某行,显示行号和该行内容
- 向互联网转型
- C++ 中while 比较少见的一种形式
- Broadcast Receiver简介
- 【特种兵PPT教程】玫瑰金的RGB色值,肾6S的玫瑰金到底是个什么鬼?学会取色!
- Android图片裁剪Demo
- 献给以人的思维去学编程的朋友们 之 if
- 走进spring之springmvc实战篇(一)
- 软件研发:公司内部技术考试——算法编程题程序框架
- 软件研发:公司内部技术考试——算法编程题程序框架
- 命中注定码农路[开篇]
- win7配置IIS服务器
- Nagios的监控原理
- zabbix 邮件报警 -- sendmail
- 搞ACM的你伤不起