求前1~n每個數的分解的非平方因子數乘積方式的和
用修改的線性篩做
a[i]表示數i的分解方法數,對每個數多試幾組資料可以發現:
1.質數的分解方法數始終為2;
2.合數的分解方法數為其兩因子數的分解方法數的乘積
若該合數為平方數,則分解方法數要除4
若該合數的其中乙個因子是n次方數(n≥3),則分解方法數為0
由於這題資料非常多(2e7),所以用線性篩不會超時,隨著線性篩的進行順便就把每個數的分解方法數都加上去了,這樣時間複雜的還是o(n)
還是要對線性篩的原理及其篩的具體細節熟悉才行
#include#include#include#includeusing namespace std;
const int n=2e7+7;
int a[n];
int prime[n];
int sum[n];
int main()
//標記目前得到的素數的i倍為非素數
for(int j=0; j線性篩 時間複雜度:o(n)
這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數
把這些合數都篩掉,即演算法名字的由來。但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。
比如10,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。
利用了每個合數必有乙個最小素因子。每個合數僅被它的最小素因子篩去正好一次。所以為線性時間。
**中體現在:
if(i%prime[j]==0)break;
prime陣列 中的素數是遞增的,當 i 能整除 prime[j],那麼 i*prime[j+1] 這個合數肯定被 prime[j] 乘以某個數篩掉。
因為i中含有prime[j], prime[j] 比 prime[j+1] 小。接下去的素數同理。所以不用篩下去了。
在滿足i%prme[j]==0這個條件之前以及第一次滿足改條件時,pr[j]必定是pr[j]*i的最小因子(可以自己輸出一下prime[j]中每個數的值,會發現i(或者是prime[j]的值)比j要大很多)
2018 icpc 南京網路賽
題目 鏈結 a.an olympian math problem 輸出n 1即可 女朋友猜的 includeusing namespace std define ll long long ll fac 103 int main for int i 1 i m i ll ans 0 for int i...
2018 ICPC 南京網路賽 skr
題意 給出乙個字串,求它的所有回文子串轉化成數字的和,對1e9 7取模。題解 先上manacher,然後列舉每個點,按照半徑從大到小的順序列舉回文串,遇到出現過的就break,統計答案即可。注意的是,判重時只能用pb ds中的gp hash table,unordered map會t,同時需要兩個字...
ICPC 南京賽區網路賽 A
題目大意就是,給你乙個數n 然後給你乙個公式求s,讓你輸出s n 這個題目不用想,直接用用題目中的公式暴力寫肯定超時 可以先手算簡化一下公式 n 1 n 1 n n 1 n 1 n!n 1 所以可得 s 1 1!n 1 n 1 2!1!3!2!n!n 1 n 1 所以s n n 1 n n 是n的倍...