ACM學習記錄 遞推與遞迴

2021-09-11 19:26:12 字數 1766 閱讀 4424

一般遍歷方式:迴圈(for)、遞推。

狀態空間規模:nk,幾重迴圈k就是幾。

此種列舉十分的常見。

一般遍歷方式:遞迴、位運算。

狀態空間規模:kn。

例如:從1~n(n<20)個整數中隨機選取任意個,輸出所有可能的方案。

#include#includeusing namespace std;

typedef long long ll;

vectorchosen;

int n;

void solve(int x)

一般遍歷方式:遞迴、剪枝。

狀態空間規模:(nm

)\tbinom

(mn​)。

一般遍歷方式:遞迴。

狀態空間規模:n!。

例如:把1~n這n個整數排成一行,輸出所有可能的次序。

#include#includeusing namespace std;

typedef long long ll;

int n;

int order[20];

bool chosen[20];

void solve(int k)

for(int i=1; i<=n; i++)

}int main()

費解的開關(ch0201):(

strange towers of hanoi(poj1958)(

例題sumdiv(poj1845):

求ab的所有約數之和mod 9901(1<=a,b<=5e7).

題解:a的質因數分解形式為:a=p1

c1p2

c2……pn

cn,那麼ab的所有約數之和就是(1+p1+p1

2+……+p1

bc1)(1+p2+p2

2+……+p2

bc2)……(1+pn+pn

2+……+pn

bcn).

求等比數列的和sum(p,c)=1+p+p2+…+pc對9901取模,取模的運算對除法沒有分配率之類的性質,一種思路是用逆元計算,另一種思路可以使用分治法求解。

若c為奇數,

sum(p,c)

=(1+p+…+p(c-1)/2)+(p(c+1)/2+…+pc)

=(1+p(c+1)/2)*sum(p,(c-1)/2);

若c為偶數,

sum(p,c)=(1+pc/2)*sum(p,c/2-1)+p^c;

#includeusing namespace std;

typedef long long ll;

const int p = 9901;

const int maxn = 5e7+10;

ll p[50005];

int prime[50005];

ll a,b;

void isprime()

} }}ll multi(ll a,ll b)

b=b>>1;

a=(a+a)%p;

} return b;

}ll pow(ll a,ll b)

b=b>>1;

a=multi(a,a);

a%=p;

} return b%p;

}ll sum(ll p,ll c)

else

}int main()

ans=((ans%p)*(sum(p[i],b*num)%p))%p;

} }if(a>1)

cout《例題:poj3889(待補充)

ACM 遞迴與遞推

看圖可知,由於蜜蜂每次只能從前1個蜂房前2個蜂房過來,從第n歌蜂房考慮 那麼f n f n 2 f n 1 注意數列的開始幾項會有所不同。f 1 0,因為蜜蜂開始在第1個蜂房 f 2 1,蜜蜂只能從第1個蜂房來到第2個蜂房 f 3 2,蜜蜂可以從第1個蜂房過來,也可以從第2個蜂房過來 即 f n f...

ACM(遞迴遞推 J)

題目 輸入乙個數n 不能是1111,2222,3333這類數 然後將這個數重新排列形成乙個最大的數最小的數,然後這兩個數的差如果等於6174這停止,輸入乙個四位數n然後按要求重新排列候做差,輸出每個做得差,然後換一行輸出差的個數。解題思路 定義乙個函式,將n的個十百千位存入陣列中,然後在分別成100...

ACM遞迴遞推練習

acm遞迴遞推練習 二分法查詢找到中間的數值,如果key目標數值大於中間值,則返回mid 1與n區間。如果小於,則返回mid 1與起始位置區間,由於輸出次數較多,用cout容易超時,用printf則可省時。include int a 3000001 int search int a,int l,in...