誰是天才
time limit:1000ms memory limit:65536k
description
這天張大牛遇到了了大肥熊。
張大牛:「我是天才!」
大肥熊:「你為什麼是天才?」
張大牛:「你隨便告訴我乙個數字,我立即可以算出它所有約數的和,以及所有約數的倒數和!」
大肥熊:「換過來,我告訴你乙個數的所有約數(包括1和該數本身)的和以及約數的倒數之和,你是天才你應該立即能推出這個數是什麼!」
張大牛被難倒了!
現在,這個難倒了天才的題目就交到您的手上了。
input
輸入檔案包含多組輸入資料。
每組資料有三個正整數a,b1和b2,(1<=a,b1,b2<=10^9) ,其中a為c的約數和,而對於c的所有倒數之和b,為避免精度誤差,以分數b1/b2的形式給出。
輸入檔案以一行「0 0 0「結束。
output
對於輸入的每一組資料,輸出一行。該行的第乙個整數n是所有滿足條件的不同的c的個數。其後按照從小到大的順序輸出n個數,為所有滿足條件的c。相鄰兩個整數之間用空格隔開,行末不要有空格。
sample input
18 9 5
1 1 2
1 1 1
0 0 0
sample output
1 10
01 1
眾所周知,若c mod a==0,則a為c的約數;
設c的所有約數為,則a=a1+c/a1+a2+c/a2+……+an+c/an,b1/b2=1/a1+1/a2+1/a3+...+1/an。
若為有序數列,可以發現:
a1*an==c;
a2*an-1==c;
...即b1/b2=1/a1+1/a2+1/a3+...+1/(c/a1)=1/a1+a1/c+1/a2+a2/c+...,所以(b1/b2)*c=c/a1+a1+c/a2+a2+....=an+a1+an-1+a2+...=a,我們可以發現(b1/b2)*c=a。
那麼可以算出,c=a/(b1/b2),但是仍要對c進行驗算,為什麼呢?
我把a,b1/b2乘以相同的倍數,雖然仍滿足上式,但c顯然不符合條件。
故先算出c,後驗證,此題得解。
**:
#include#includeusing namespace std;
long long a,b1,b2;
int main()
else printf("0\n");
scanf("%lld%lld%lld",&a,&b1,&b2);
}return 0;
}
當然,檢驗演算法可以進一步優化。
用線性篩法篩出素數,對於每個能整除的素數,不斷除以它至不可整除,最後可寫成c=2^a+3^b+……+(乙個很大的素數)^(若干次方)。
那麼a=(1+2^1+2^2+……+2^a)(1+3^1+3^2+……+3^b)……(),等比數列求和即可。
誰是天才(續)
張大牛 我是天才!大肥熊 你為什麼是天才?張大牛 你隨便給我乙個單詞 大小寫字母組成 長度為n,去掉m個字元後,我能知道字典序最小的字串是什麼樣子的 大肥熊 換過來,現在假設這個字典序最小的字串中第ai個字元在原串中的位置為pos,那麼原串中區間 pos ki,pos ki 中字典序最大的字元是什麼...
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...
Safebreaker 解題報告
又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...