• 七夕节 (HDU


    七夕节 (HDU - 1215) 【简单数论】【找因数】

    标签: 入门讲座题解 数论


    题目描述

    七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
    人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
    题目描述
    数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
    你想知道你的另一半吗?
    Input
    输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
    Output
    对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
    Sample Input

    3
    2
    10
    20
    

    Sample Output

    1
    8
    22
    

    题意

    给定一个(n),找到它的全部因数(除了它本身),相加和是多少?


    解析

    • 朴素做法就是循环一遍比(n)小的数,然后看看每个(i)是否是(n)的因数(n % i == 0),如果是的话就加上。但是这么做的时间复杂度是(O(n)),显然,对于这道题这么大的数据量是过不了的。

    • 优化一下。我们发现对于一个数的因数而言,除了完全平方数落在(sqrt{n})的因数以外,都是成对出现的。那么我们其实只要在([2, sqrt{n}])范围内找因数就可以了,找到一个因数,另一个因数做除法就也找到了。这样的时间复杂度是(O(sqrt{n})),对于这道题是可以通过的。


    通过代码

    /*
    Problem
        HDU - 1215
    Status
    	Accepted
    Time
    	312ms
    Memory
    	1360kB
    Length
    	667
    Lang
    	G++
    Submitted
    	2019-11-25 14:23:52
    RemoteRunId
    	31628051
    */
    
    #include <bits/stdc++.h>
    using namespace std;
    
    inline int read()      //快读,读入速度比scanf()快.当输入数据量较大时,使用快读可以明显加快程序速度.
    {
        int res = 0;
        char ch;
    
        ch = getchar();
    
        while(!isdigit(ch)){
            ch = getchar();
        }
    
        while(isdigit(ch)){
            res = (res << 3) + (res << 1) + ch - 48;
            ch = getchar();
        }
    
        return res;
    }
    int main()
    {
        int times;
    
        times = read();
    
        while(times --){
            int n, ans = 1;
            n = read();
            for(int i = 2; i * i <= n; i ++)      //只要在[2,sqrt(n)]内找因数即可.
                if(n % i == 0){
                    if(n / i != i)
                        ans += i + n / i;
                    else
                        ans += i;                //注意出现完全平方数的sqrt(n)因子时,只加一次即可.
                }
    
            printf("%d
    ", ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    Apache日志分析
    iptables日志探秘
    php与其他一些相关工具的安装步骤分享
    ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_830_0.MYI' (Errcode: 13)
    一些可能需要的正则
    restful api的简单理解
    认识MySQL Replication
    如何处理缓存失效、缓存穿透、缓存并发等问题
    经典算法mark
    php常用的一些代码
  • 原文地址:https://www.cnblogs.com/satchelpp/p/11939380.html
Copyright © 2020-2023  润新知