1. 程式人生 > >hdu 1215 七夕節(數論)

hdu 1215 七夕節(數論)

hdu 七夕節 (1215)

Problem Description
七夕節那天,月老來到數字王國,他在城門上貼了一張告示,並且和數字王國的人們說:”你們想知道你們的另一半是誰嗎?那就按照告示上的方法去找吧!”
人們紛紛來到告示前,都想知道誰才是自己的另一半.告示如下:

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

一開始拿到這個題目會想這很簡單,不就是求一個數的因子和嘛。
不過要考慮資料的大小,如果開一個迴圈不細細考慮減少複雜度的話可能超時。
恩,問題就在這裡。我們知道,一個數的因子總是成對出現的,譬如說:
假設

      t=m*n(t,m,n均為正整數);

那麼可以斷定m和n其中必有一個小於等於根號t,另一個大於等於根號t,

    令k*k==t(k為正實數),如果t=m*n,並且m<=k,則有n>=k;

(對於細節不加以詳述,大家可以在網上找找度娘)

那麼就可以想辦法把迴圈的次數由N減少到根號N,避免超時。

程式碼如下(細節問題請看程式碼):

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    cin>>n;
    while(n--)
    {
        int sum=1;
        cin>>m;
        for(int i=2;i*i<=m;i++)   //給出資料太大,將迴圈範圍縮小避免超時
            if(m%i==0)
            {
                if(i!=m/i) sum=sum+i+m/i;   //判斷該數是m的因子並且是比根號m小的一個因子,因為迴圈次數縮小,根據上面所述,要將另一個因子一併加上
else sum=sum+i; //否則即可判定該數為m的平方根,因為兩個平方根相同,即只需要加一次便可 } cout<<sum<<endl; } return 0; }