zoukankan      html  css  js  c++  java
  • HDU 1215

    今天碰到一题有趣的水题~~

    先上题目:

    七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
    人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:

        大概意思:给出一个数字N,然后把这个数的 因子 全部相加起来,然后输出。

    数字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


    一开始的思路是直接暴力求解,就是一个个数字去试下看看能不能整除,能就加上。当时想着应该是道水题应该不会怎么为难我,嗯,超时了~

    后面想到 貌似和求素数有些相似之处,就按这个思路走了下去,AC了。下面上思路:

      先建立一个数组。

      然后首先 1肯定能被 大于等于1的数整出,所以每一个数都加上1。

      之后 2 肯定能被它的倍数所整除 所以每一个2的倍数都加上2

      再然后 3 肯定也能被它的倍数所整除 所以每一个3的倍数都加上3

      以此类推..........

      最后,输出的值就是对应 表中的数值就对了。

      下面上代码:

    #include<iostream>
    using namespace std;
    #define inf 500001
    int a[inf];
    
    int main()
    {
        for (int i = 1; i < inf; i++) {
            for (int j = i * 2; j < inf; j += i) {
                a[j] += i;
            }
        }
        int n;
        cin >> n;
        while (n--)
        {
            int x;
            cin >> x;
            cout << a[x] << endl;
        }
        return 0;
    }
  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/caibingxu/p/9937352.html
Copyright © 2011-2022 走看看