hdu 1215 七夕節(數論)
阿新 • • 發佈:2019-01-31
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;
}