1 X 1 Y 1 N!的兩種O n 做法

2021-07-05 02:18:49 字數 1183 閱讀 1515

題目大意:

求1/x+1/y=1/n!的答案對數。

解題思路1:

設 m=n! ,由等式知x,y必定大於n!,所以再設 x=n!+k=m+k 帶入 1/m=1/x+1/y 中化簡得到y=m*m/k+m,因y為整數,所以要求k整除m*m,即k為m*m的因子,問題便轉化為求n!*n!的因子個數, 設n!=p1^e1 * p2^e2 * p3^e3 *...*pk^ek,則 n!*n!= p1^(2*e1) * p2^(2*e2) *...*pk^(2*ek) 。 則因子個數sum=(2*e1+1)*(2*e2+1)*...*(2*ek+1)。

對於每個質數p,它的出現次數等於[n/p]+[n/p^2]+...,這樣對於每個p是o(log_p(n))的,而1~n之間的質數有o(n/lnn)個,均攤一下就是o(n)的。

至於怎麼算每個質數p出現的次數,p的次數等於[n/p]+[n/p^2]+[n/p^3]+....這個可以看成是把1~n裡p的倍數的數字都除掉乙個p,這樣的數有[n/p]個,除完之後這[n/p]個數會變成1~[n/p],然後再除掉乙個p,就是[[n/p]/p]個,然後變成1~[n/p^2],一直做下去。

#include#include#include#include#include#include#include#include#include#define ll long long

#define db double

#define eps 1e-15

#define inf 1e16

#define pa pairusing namespace std;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,cnt=0;

bool f[1000010];

int pri[1000010],num[1000010];

void pre()

} }}int main()

} ll ans=1;

for (int i=1;i<=cnt && pri[i]<=n;i++)

if (num[i]>=1) ans*=(2*num[i]+1);

ans=(ans-1)/2+1;

printf("%lld\n",ans);

}}

解題思路2:

待補。

兩種設計模式 1 「簡單工廠」

我們以做乙個計算器為例,給大家介紹簡單工廠的應用 效果 這裡我們使用 繼承 虛方法,簡單工廠的設計模式來完成 首先,我們除了搭好窗體外,我們應該把我們的一些類準備好 1.計算的父類calculation using system using system.collections.generic us...

shared ptr 兩種常見的使用方式 1

roger roger2yi gmail.com 1.當作類物件的 共享控制代碼 來使用 2.在類內部提供資源管理服務 為類提供資源的共享拷貝語義 或稱為淺拷貝 shadow copy 並在正確的時間 資源 上述的兩種方式一種是在類外部使用,一種是在類內部使用,然而這兩種方式並不是非此即彼的關係,很...

執行緒 1 建立執行緒的兩種方式

1.程序個執行緒的區別 程序 系統程式執行的最小單位,乙個程式至少有乙個程序 系統會在記憶體中開闢一塊空間用來執行程式。執行緒 程式執行任務的最小單位,執行緒不能單獨存在,必須存在與程序中,乙個程序中至少包含乙個執行緒。2.建立和啟動執行緒的兩種方式 建立執行緒的方式一 public class 類...