尤拉計劃433題:歐幾里德演算法的步數
記E(x0, y0)為運用歐幾里德演算法求x0和y0的最大公約數的步數。更加正式的說:
x1 = y0, y1 = x0 mod y0
xn = yn-1, yn = xn-1 mod yn-1
E(x0, y0)是使得yn = 0的最小的n。
已知E(1,1) = 1,E(10,6) = 3以及E(6,10) = 4。
對於1 ≤ x,y ≤ N,定義S(N)為所有E(x,y)的和。
已知S(1) = 1,S(10) = 221以及S(100) = 39826。
求S(5·106)。
求gcd步數方法1,迴圈,方法2,遞迴,方法3,遞迴+快取,方法4,迴圈+快取
#include <cstdio> #include <cmath> #define NN 100 static char gs[NN+1][NN+1]= {0}; int a,b; int srv=0,s=0; int gcdstep4sieve(int n) { for(a=1; a<=NN; a++) { gs[a][1]=1; for(b=a; b<=NN; b+=a) { gs[b][a]=1; } } for(a=1; a<=NN; a++) for(b=1; b<=a-1; b++) for(int n=b; n<=NN; n+=a) gs[n][a]=gs[a][b]+1; for(a=1; a<=NN; a++) for(b=1; b<=NN; b++) { //if(gs[a][b]==0)printf("(%d,%d)",a,b); s+=gs[a][b]; } printf("s=%d\n",s); } int gcdstep3(int a,int b) { int r1=a%b; if(r1!=0) { int rv=gs[b][r1]; if (rv>0) { srv+=rv; s++; gs[a][b]=1+rv; return 1+rv; } else return 1+gcdstep3(b,r1); } gs[a][b]=1; return 1; } int gcdstep2(int a,int b) { int r1=a%b; if(r1!=0) { return 1+gcdstep2(b,r1); } return 1; } int gcdstep(int a,int b) { int a1,b1,r1; int c=1; a1=a; b1=b; r1=a1%b1; while(r1!=0) { a1=b1; b1=r1; r1=a1%b1; c++; } return c; } int main() { gcdstep4sieve(NN); return 1; int cnt=0,e=0; for(a=1; a<=NN; a++) for(b=1; b<=NN; b++) { e=gcdstep3(a,b); cnt+=e; //printf("E(%d,%d)=%d\n",a,b,e); } printf("S(%d)=%d,s=%d,srv=%d",NN,cnt,s,srv); return 0; } --結果 S(10000)=782828208 1 11.151 2 11.273 3 2.802 4 2.213
逐個計算太慢,考慮:
1. 所有E(n,1)=1
2. 所有E(n*m,m)=1
3. 所有E(n,m)=1+E(m,(n%m)),即E(r+m*r,m)=1+E(m,r)
如下圖所示,如果能計算出每個返回值各有多少個出現,就能快速合計。
顯然返回值1的總數是N/1+N/2...N/N
相關文章
- 尤拉計劃425題:質數連線
- 尤拉計劃512題(冪的尤拉總計函式和)函式
- 尤拉計劃595題:增量隨機排序隨機排序
- 尤拉計劃463題:奇怪的遞迴關係遞迴
- 尤拉計劃605題:結對投幣遊戲遊戲
- 用尤拉計劃題目來學q語法
- 尤拉計劃533題:卡邁克爾函式函式
- 000. 尤拉計劃簡介
- 對尤拉計劃427題(n-序列) 的一些分析
- 尤拉計劃287題:四分樹編碼(一個簡單的壓縮演算法)演算法
- 尤拉計劃695:隨機長方形隨機
- 尤拉計劃717:取模公式之和公式
- 尤拉計劃697:隨機衰減序列隨機
- 尤拉計劃713:圖蘭熱水系統
- 【總結】理解歐幾里德及擴充套件歐幾里德演算法套件演算法
- 尤拉計劃711:二進位制黑板
- 利用容斥原理求尤拉計劃565題的S(1E9,2017)
- 尤拉計劃701:隨機連線區域隨機
- 尤拉計劃386題(反鏈的最大長度) 論壇python解法學習筆記Python筆記
- 尤拉計劃386題(反鏈的最大長度) 論壇c++解法學習筆記C++筆記
- 除錯433M模組遇到的問題除錯
- 歐幾里德的遊戲遊戲
- 模擬退火演算法Python程式設計(3)整數規劃問題演算法Python程式設計
- 歐幾里德演算法(又稱輾轉相除法)求最大公約數,以及最小公倍數演算法
- 演算法題-測試用例執行計劃演算法
- Note -「因數的尤拉函式求和」函式
- 演算法提高 數的劃分 動態規劃 無序演算法動態規劃
- 數論裡的尤拉定理,試證明
- 演算法學習計劃演算法
- 前端學習演算法2: 揹包問題 ,一步一步思考(動態規劃入門)前端演算法動態規劃
- 素數個數 <埃式篩 && 尤拉篩>
- 尤拉篩線性篩質數
- Fleury演算法-輸出尤拉回路演算法
- 整數劃分問題(動態規劃)動態規劃
- 成功實施BPM計劃的5個步驟 - ProServROS
- 演算法設計--眾數和重數問題(分治法)演算法
- 一些“尤拉路”板題
- 設計引數化查詢的計劃指南