目錄
如何求出1~n的素數個數呢
我們只要將素數的倍數全部篩掉就可以
**
埃氏篩
int isprime(int n)
return cnt;
}
埃氏篩法會將合數重複地篩掉,如有可以只篩一次合數,那麼複雜度就會降到o(n)
線性篩(尤拉篩)就是通過合數最小的質因子篩掉這個合數
int isprime(int n)
}return cnt;
}
求1~n的尤拉函式的和
乙個數n,那麼1~n中和n互質的數的個數,就是n的尤拉函式
尤拉函式有以下性質:
暴力寫法直接求每個數的尤拉函式,再sum求和,複雜度接近n*n了
# include using namespace std;
typedef long long ll;
ll oula(int n)
}if (n > 1) res = res/n*(n-1);
return res;
}int main()
下面是線性篩法,先看**,再解釋
# include using namespace std;
typedef long long ll;
const int n = 1e6 + 10;
bool st[n]; // 這裡記錄狀態
ll prime[n]; // 存質數
ll phi[n]; // 尤拉函式
ll euler(ll n)
for (int j = 0; prime[j] <= n/i; j ++)
phi[i * prime[j]] = (prime[j] - 1) * phi[i];}}
ll sum = 0;
for (int i = 1; i <= n; i ++)
sum += phi[i];
return sum;
}int main()
6 可以是 23 ,那麼 尤拉函式就是6(1-1/2)*(1-1/3),這裡n是6, 而對於求2的100次方乘上 3的一百次方這樣的數的樓拉函式,底數是不會改變的,我們 只需要更新n就可以
求phi[primes[j]i],分析phi[primes[j]i]和phi[i]的關係
如果i%primes[j]==0時,說明primes[j]為i的最小質因子
,而phi[i]內已經乘過(primes[j]-1)/primes[j]
∴計算phi[primes[j]i]只需要更新n的值即可,即在phi[i]的基礎上乘個primes[j]
∴phi[primes[j]i]=primes[j]phi[i];
如果i%primes[j]!=0時,primes[j]小於i的最小質因子,而phi[i]內沒有乘過(primes[j]-1)/primes[j]
∴計算phi[primes[j]i]除了需要更新n值外,還需要乘上(primes[j]-1)/primes[j]
∴phi[primes[j]i]=primes[j]phi[i](primes[j]-1)/primes[j]=phi[i](primes[j]-1)
再看看大佬的**促進理解:
素數 篩 理解
埃拉託斯特尼篩法的時間複雜度是o n lglgn bool vis maxn 能否被 素數合成 int prime maxn cnt 0 void prime int num 線性篩 接近o n bool vis maxn 能否被 素數合成 int prime maxn cnt 0 void pri...
單調棧理解及應用
單調棧 棧內元素,按照 單調遞增或單調遞減 排序,如果新入棧元素破壞了單調性,就彈出棧內元素,直到滿足單調性。作用 o n 時間複雜度分別求左右兩邊第乙個比它大或比它小的元素。單調遞增棧為例 維護 每次入棧前先檢驗棧頂元素和進棧元素的大小,判斷棧內元素是否出棧 棧內元素大於等於入棧元素則棧內元素出棧...
session的理解及應用
in computer science,in particlular networking,a session是一種在多個裝置 計算機或者使用者 login session 之間進行的半永久性 其資訊傳輸通道是活動的 的互動式 動作 的資訊交換過程,即連線建立到連線斷開的這一時間段中一系列的資訊交換...