上午递归,文件
点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define T long long
typedef long long LL; // 取别名,以后使用 LL 就是 long long
const int N=5e3+10;
LL fib[N];
LL f(int n){ // 递归
if(n<=2) return 1;
return f(n-1) + f(n-2);
}
int main(){
fib[0]=fib[1]=1; // 递推
for(int i=2; i<N; i++) {
fib[i] = fib[i-1] + fib[i-2];
// cout<<i<<" : "<< fib[i]<<endl;
}
int n;cin>>n;
// cout<<f(n)<<endl;
cout<<fib[n]<<endl;
return 0;
}
- 汉诺塔
【例】Hanoi(汉诺)塔问题。
古代有一个梵塔,塔内有3个座A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
void hanoi(int n,char a,char b,char c){
if(n==1){
// printf("%c->%c\n",a,c);
cout<<a<<" "<<c<<endl;
return;
}
hanoi(n-1, a,c,b);
hanoi(1, a,b,c);
hanoi(n-1, b,a,c);
}
int main(){
int n; cin>>n; // scanf("%d", &n);
hanoi(n,'A','B','C');
return 0;
}
点击查看代码
#include<iostream>
using namespace std;
const int N=1e6+10, INF=0x3f3f3f3f;
typedef long long LL;
int p;
LL halfpow(int a,int n){
if(n==1) return a;
LL ans = halfpow(a, n/2);
ans = ans*ans%p;
if(n&1) ans=ans*a%p;
return ans;
}
int main(){
int a,b; scanf("%d%d%d",&a,&b,&p);
LL s = halfpow(a, b);
printf("%d^%d mod %d=%lld\n",a,b,p,s);
return 0;
}