题目大意:f(n)为n的因子和,给出 n 求 1~n 中f(n)为偶数的个数.

题目思路:算数基本定理:

n=p1^e1*p2^e1 …… pn^en (p为素数);

f(n)=(1+p1+p1^2+p^3……+p^e1)*(1+p2+p2^2……+p2^e2)……*(1+pn+pn^2……+pn^en)。

偶数个个奇数相乘仍为奇数,奇数个奇数相乘则为偶数,为了使f(n)为奇数,那么多项式中的每一项都应为奇数。

对于每个多项式内:偶数个奇数相加为偶数,奇数个奇数相加为奇数,为了使多项式为奇数,那么e应为偶数(因为前面还要加1)。

我们知道:

若 n=p1^e1*p2^e1 …… pn^en;

那么 n^2=(p1^e1*p2^e1 …… pn^en)^2 =p1^2e1*p2^2e1 …… pn^2en。

2为唯一一个偶素数,且p=2的项一定为奇数。

所以我们则需要统计1到n中的平方数个数和2倍的平方数的个数,得到的为1到n中f(n)为奇数的个数。

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1005 using namespace std; int main()
{
int cnt=,T;
long long n,sum;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
sum=;
for(long long i=;i*i<=n;i++)
{
sum++;
if(*i*i <= n)
sum++;
}
printf("Case %d: %lld\n",cnt++,n-sum);
}
}

最新文章

  1. NOSDK--关于android傻瓜式的分包设想
  2. bootstrap插件思路整理
  3. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
  4. 自动垂直居中的js
  5. C#线程池ThreadPool的理解
  6. Android使用SimpleAdapter
  7. Player启动时提示 &quot;System.InvalidOperationException:无法加载计数器名称数据
  8. 关于PHP的mkdir函数
  9. 在linux上安装MySQL数据库,并简单设置用户密码,登录MySQL
  10. Oracle 11g streams部署
  11. switch的穿透,是参数里包含case内容就执行。
  12. Nginx ab压力测试
  13. Firefox及我使用的firefox扩展
  14. JAVA爬取百度贴吧图片
  15. 2016-2017-2 20155309南皓芯java第四周学习总结
  16. C语言实现选择排序算法
  17. 基于bootstrap物资管理系统后台模板——后台
  18. linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):
  19. 附3:tips of layout binding and styling
  20. JavaScript防止重复提交表单

热门文章

  1. java 视频中截图
  2. hdu_5903_Square Distance(dp)
  3. 浙大pat 1054 题解
  4. stack(STL)
  5. uhttpd配置文件分析
  6. 阿里云 镜像 源 debian
  7. shell 提取字符串
  8. ADO.NET 数据访问类查询、属性扩展
  9. Python 学习笔记6
  10. Java判断PC端还是移动端