尤拉計劃386題(反鏈的最大長度) 論壇c++解法學習筆記
這是stubbscroll的帖子,他也沒有把程式碼貼全。我補充了生成最小質因數部分。有趣的是,如果生成的不是最小質因數,也能出正確答案,速度也差不多。要使生成的不是最小質因數,把for(int j=i*i; j<=N; j+=i*((i>2)?2:1))
的步長改為j+=i
。這樣會把12的最小質因數2用3覆蓋。divs原來是向量,我改為陣列後,放在main函式內,會執行出錯,因此移動到外面。
#include<vector> #include<cstdio> #include<cmath> #include<ctime> using namespace std; #define N 100000000 #define P(X) printf("%s %ldms\n",X,clock()-t);fflush(stdout); int divs[N+1]= {0}; int main() { int t=clock(); //vector<int> divs = genPrimes(N, true); // minimal divisors divs[1]=1; for(int i=2; i<=sqrt(N); i++)//i+=(i>2)?2:1) slower if(divs[i]==0) { for(int j=i*i; j<=N; j+=i*((i>2)?2:1)) divs[j]=i; divs[i]=i; } for (int i = 2; i <= N; ++i) if(divs[i]==0)divs[i]=i;//prime's fact is itself P("gen prime min factor done"); vector<int> degs(N + 1); vector< vector<int> > byDegs(30); degs[1] = 0; byDegs[0].push_back(1); for (int i = 2; i <= N; ++i) { degs[i] = degs[i / divs[i]] + 1; byDegs[degs[i]].push_back(i); } P("gen degress done"); long long ans = 0; for (int i = 0; i < 29; ++i) { int low = 0, high = byDegs[i].size() - 1; while (low < byDegs[i].size()) { while (high >= 0 && (long long)byDegs[i][high] * byDegs[i][low] > N) { --high; } ans += high + 1; ++low; } low = 0, high = byDegs[i + 1].size() - 1; while (low < byDegs[i].size()) { while (high >= 0 && (long long)byDegs[i + 1][high] * byDegs[i][low] > N) { --high; } ans += high + 1; ++low; } } printf("%lld\n", ans); P("all done") } --正確最小質因數 D:\>a gen prime min factor done 1903ms gen degress done 4056ms 528755790 all done 5319ms --不正確最小質因數 D:\>a A 2730ms gen prime min factor done 2979ms gen degress done 5257ms 528755790 all done 6552ms
上述j+=i*((i>2)?2:1)
只能保證偶數不被覆蓋,參考了stubbscroll發的前一貼,還要加上if(divs[j]==0)
才能保證所有最小質因數都不被覆蓋。但反正算錯也能出正確答案,這個條件不加也行。
相關文章
- 尤拉路徑學習筆記筆記
- 尤拉計劃700:尤拉幣
- 尤拉計劃695:隨機長方形隨機
- 尤拉公式 - 筆記公式筆記
- 尤拉計劃622:洗牌
- 尤拉計劃686:2的冪
- 尤拉計劃739:和的和
- 尤拉計劃698:123數
- 尤拉計劃696:麻將
- 尤拉計劃719:拆分數
- 尤拉計劃699:三腳數
- 尤拉計劃706:三象數
- 尤拉計劃718:不可達數
- 尤拉計劃715:六元組
- 尤拉計劃709:偶數袋
- 尤拉計劃708:你只要2
- 尤拉計劃712:指數差
- 尤拉計劃749:近似冪和
- 尤拉計劃751:串聯重合
- 尤拉計劃745:平方和
- 尤拉計劃717:取模公式之和公式
- 尤拉計劃722:慢收斂系列
- 尤拉計劃694:立方滿因數
- 尤拉計劃725:數位之和數
- 尤拉計劃710:1百萬會員
- 【圖論】尤拉圖圖論
- 尤拉計劃657:不完整的單詞
- 尤拉計劃714:兩種數位的數
- 尤拉計劃723:畢達哥拉斯四邊形
- 尤拉計劃697:隨機衰減序列隨機
- 尤拉計劃713:圖蘭熱水系統
- 尤拉計劃711:二進位制黑板
- 尤拉計劃747:三角披薩
- 尤拉計劃748:倒丟蕃多方程
- 尤拉計劃658:不完整的單詞(2)
- 尤拉計劃735:2n^2的因數
- 尤拉計劃721:無理數高次冪
- 尤拉計劃701:隨機連線區域隨機
- 尤拉計劃705:除數序列的逆轉次數