一般遍歷方式:迴圈(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...