誰是天才 解題報告

2021-08-17 01:35:29 字數 1574 閱讀 1490

誰是天才

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 ...