階乘除法(很久之前的一道題,感覺挺好的,遂記錄之

2022-05-18 09:46:13 字數 1087 閱讀 7942

題目描述:

f:階乘除法

輸入兩個整數n,m 輸出n!/m!

是不是很簡單?現在我們把問題反過來,輸入k=n!/m! 找到這樣的整數二元組(n,m)

因為答案不唯一,n應該盡可能小。

輸入:k(1<=k<=100000000)

輸出輸出n和m,無解輸出」impossible」

樣例case 1: 5 1

case 2: impossible

case 3:7 4

題解:這個題不能用乘法做是肯定的,但是怎麼用別的方法做呢,我們就想如果 k = t1*t2*t3....*ti,那麼t1 t2 ..ti 肯定是連續的。

於是乎我們就想用 列舉 for i 1-k ,然後再每次用 k 去除序列中的每個數,如果k%i ==0 就繼續除,一直到 k=1為止,如果一直到最後k!=1

那麼 n = k ,m = k-1 (k!=1) 但是,k的範圍是 1-10^9 ,列舉肯定不現實,那麼我們有沒有可能縮小這個範圍呢?我們發現 如果 t1 = sqrt(k)

那麼 t1*t2 = k+sqrt(k)>k ,於是乎 k 的範圍被我們成功的縮小到了 10^4.5次方,接下來寫程式就不是問題了.

#include #include 

using

namespace

std;

intmain()

int flag=1

;

for(int i=1;i*i///

列舉mint temp =k;

int num =i;

while(temp%num==0

)

if(temp==1

) }

if(flag)

printf(

"case %d: %d %d\n

",t++,n,m);

}}

2016.8.6更新,其實可以用一種更加簡潔的方法做:尺取法。

n!/m!=k  這個模型轉化一下就是 在連續區間[1,sqrt(k)]裡面找乘積為k的子串,不存在輸出 k k-1. 這樣就化成區間模型了,**的話應該是很容易的.

兩道禁止乘除法的題

假設有某種很低階的晶元,不提供乘除法指令。問題1 計算從1加到n的和 即 1 2 3 n 問題2 求3的餘數。對問題1,直接從1加到n,效率太差了,肯定不能這麼幹 小高斯都知道用乘法 既然不能用乘除法,那只好用加法來模擬了。m n,可以看做是 n個m相加,可以看做是 m,2 m,4 m,8 m,16...

巧解一道階乘排序題

今天,介紹一道在本計算機考試書上的階乘排序 就是將乙個列表長度的階乘種的方式的排列組合輸出 題。下面我們直接看題 在1 49中任意選擇7個數,將這7個數的所有排列可能性全部輸出。例如 1,2,3 的所有輸出有 2,1,3 2,3,1 3,2,1 3,1,2 1,3,2 1,2,3 這道題的關鍵是要找...

一道演算法題 不用加減乘除做加法

題目 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。解析 首先看十進位制是如何做的 5 7 12,三步走 第一步 相加各位的值,不算進製,得到2。第二步 計算進製值,得到10.如果這一步的進製值為0,那麼第一步得到的值就是最終結果。第三步 重複上述兩步,只是相加的值變成上述兩步的...