倍數法求正約數集合

2021-10-08 08:58:18 字數 509 閱讀 3243

題意:求1-n每個數的正約數集合,如果用o(sqrt(n))的試除法去做,總複雜度o(nsqrt(n))複雜度太高,當n=1e6的時候就卡了

思路:反過來考慮,對於每個數d,1-n中以d為約數的數就是d的倍數d,2d,3d,4d…[n/d]*d;

時間複雜度o(nlogn):怎麼算?

n+n/2+n/3+n/4+n/5+n/6+….n/n=n(1+1/2+1/3+1/4+1/5+…..1/n)=o(nlogn)

後面是個調和級數,關於調和級數的和大致的答案我之前有寫

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5;

typedef long long ll;

vecto***ctor[maxn];

int main(void)

return 0;

}

分支限界法 求最小倍數

題目 輸入要求 輸入的第一行有兩個整數,分別為該自然數n和數字的個數m,第2行有m個數字 0 m 9 數字之間用空格隔開。輸出要求 輸出一行為由這些數字所組成的該自然數的最小倍數,數字可重複使用。如果不存在這樣的數,則輸出0.樣例輸入 22 3 7 0 1 樣例輸出 110樣例輸入 22 3 7 0...

「求公約數」和「求公倍數」之類問題的「逆問題」

一 問題描述 已知正整數a0,a1,b0,b1,設某未知正整數x滿足 1 x和a0的最大公約數是a1 2 x和b0的最小公倍數是b1。求出滿足條件的正整數x。這樣的x並不唯一,甚至可能不存在。考慮如何求解滿足條件的x的個數。程式設計求解這個問題。輸入格式 輸入第一行為乙個正整數n,表示有n組輸入資料...

求2個整數的公倍數和公約數

以下用2種方法求最大公約數和最小公倍數 package jk public class datatest 以下是一般的演算法 class diviserandmultiple 輾轉相除法求公約數 public int commondiviser while y x 0 return x 公倍數第1種...