【LightOJ1336】Sigma Function(数论)

题面

Vjudge

求和运算是一种有趣的操作,它来源于古希腊字母σ,现在我们来求一个数字的所有因子之和。例如σ(24)=1+2+3+4+6+8+12+24=60.对于小的数字求和是非常的简单,但是对于大数字求和就比较困难了。现在给你一个n,你需要求出有多少个数字的σ是偶数。

注:一个数字的σ指这个数的所有因子之和

题解

现在观察一下数的因子和的奇偶性

如果这个数是一个奇数

那么,它的因子一定成对存在

且每一对的和都是偶数

但是,如果是完全平方数,那么它有一对为奇数

所以,所有奇数的完全平方数的因子和是奇数

如果这个数是偶数

那么,它可以写成\(2^x*n\)的形式

它的因子也可以看成成对存在的

所以,如果因子两项中都是偶数,那么和也是偶数,

所以,需要考虑的是分解成\(2^x*a\)和\(b\)的形式

但是\(a,b\)是对称的,所以有\(2^x*a\)就必有\(2^x*b\)

所以,这样组合起来还是偶数

但是,发现当\(n\)是完全平方数的时候

只能写出一个\(2^x*\sqrt n\)和\(\sqrt n\)

此时的因数的和是奇数

所以,我们发现,

只有\(2^x*i^2\)且\(i\)是奇数的时候

他们的因子的和才是奇数

所以,要求的就是\(n\)中含有几个\(2^x*i^2\)

每次把\(n\)除二,这样考虑每次的结果中含有几个\(i^2\)的倍数就行了


补充\(O(1)\)做法

上面的分类可以继续简化:

也就是所有的完全平方数和他们的两倍

所以,减去的值就是\(\sqrt n + \sqrt \frac{n}{2}\)


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
int T=read();
for(int gg=1;gg<=T;++gg)
{
ll n=read(),l=sqrt(n);
ll ans=n;
while(n)
{
ll gg=sqrt(n);if(gg%2==0)gg--;
ans-=(gg+1)/2;
n>>=1;
}
printf("Case %d: %lld\n",gg,ans);
}
return 0;
}

【LightOJ1336】Sigma Function(数论)的更多相关文章

  1. LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数

    题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function    PDF (English) Statistics Forum ...

  2. LightOJ1336 Sigma Function(约数和为偶数的个数)

    Sigma Function Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  3. LightOJ 1336 Sigma Function(数论 整数拆分推论)

    --->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. ...

  4. LightOJ-1336 Sigma Function 唯一分解定理 巧妙使用sqrt()等算数目

    题目链接:https://cn.vjudge.net/problem/LightOJ-1336 题意 给出一个区间[1, n],求区间内所有数中因数之和为偶数的数目 思路 第二次写这个题 首先想到唯一 ...

  5. LightOJ1336 Sigma Function

    题意 求和运算是一种有趣的操作,它来源于古希腊字母σ,现在我们来求一个数字的所有因子之和.例如σ(24)=1+2+3+4+6+8+12+24=60.对于小的数字求和是非常的简单,但是对于大数字求和就比 ...

  6. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】

    Sigma Function (LightOJ - 1336)[简单数论][算术基本定理][思维] 标签: 入门讲座题解 数论 题目描述 Sigma function is an interestin ...

  7. LightOJ - 1336 - Sigma Function(质数分解)

    链接: https://vjudge.net/problem/LightOJ-1336 题意: Sigma function is an interesting function in Number ...

  8. Uva 11395 Sigma Function (因子和)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/C   题目在文末 题意:1~n (n:1~1012)中,因子 ...

  9. LightOJ 13361336 - Sigma Function (找规律 + 唯一分解定理)

    http://lightoj.com/volume_showproblem.php?problem=1336 Sigma Function Time Limit:2000MS     Memory L ...

随机推荐

  1. Nginx配置参数中文说明

    #定义Nginx运行的用户和用户组 user www www;   #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8;   #全局错误日志定义类型,[ debu ...

  2. LeetCode - 307. Range Sum Query - Mutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  3. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  4. python 两个list 求交集,并集,差集

    def diff(listA,listB): #求交集的两种方式 retA = [i for i in listA if i in listB] retB = list(set(listA).inte ...

  5. JavaScript 常用单词整理

    JS单词 push :添加一个数组元素 document :文档 pop :删除最后一个数组元素 console :控制台 shift :删除第一个数组元素 string :字符串 Concat 组合 ...

  6. 【Unity3D技术文档翻译】第1.8篇 AssetBundles 问题及解决方法

    上一章:[Unity3D技术文档翻译]第1.7篇 AssetBundles 补丁更新 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Deve ...

  7. Java经典编程题50道之七

    输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. public class Example07 {    public static void main(String[] args) ...

  8. return的新思考

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  9. .addClass(),.removeClass(),.toggleClass()的区别

    .addClass("className")方法是用来给指定元素增加类名,也就是说给指定的元素追加样式: 可以同时添加多个类名,空格符隔开 $("selector&quo ...

  10. Python实现二分查找

    老生常谈的算法了. #!/usr/bin/python # -*- coding:utf-8 -*- # Filename: demo.py # 用python实现二分查找 def binarySea ...