#include <iostream>
using namespace std;
const int m=32767,N=1e6+10;
int p[N];//记忆数组
//由于递归过程中会出现冗余的计算,使用记忆化搜索,进行剪枝
//记忆化搜索
int Pell(int n){//n==5
if(p[n]) return p[n];
if(n<=2) return p[n]=n;
return p[n]=(Pell(n-1)*2%m+ Pell(n-2)%m)%m;
}
signed main(){
int n;cin>>n;
//在线运算
while(n--){
int x;cin>>x;
cout<<Pell(x)<<endl;
}
return 0;
}
Pell数列的离线处理
#include <iostream>
using namespace std;
#define int long long
const int m=32767,N=1e6+10;
int p[N];//记忆数组
//由于递归过程中会出现冗余的计算,使用记忆化搜索,进行剪枝
//记忆化搜索
int Pell(int n){//n==5
if(p[n]) return p[n];
if(n<=2) return p[n]=n;
return p[n]=(Pell(n-1)*2%m+ Pell(n-2)%m)%m;
}
signed main(){
int n;cin>>n;
//离线操作
Pell(1e6);
while(n--){
int x;cin>>x;
cout<<p[x]<<endl;
}
return 0;
}
最大公约数和最小公倍数
#include <iostream>
using namespace std;
int gcd(int a,int b){//3 6
// if(!b) return a;
// return gcd(b,a%b);
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
int main(){
int a,b;cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
1204:爬楼梯
#include<iostream>
#include<string>
using namespace std;
#define int long long
const int N=35;
int mry[N];
int f(int n){
if(mry[n]) return mry[n];
if(n<=2) return mry[n]=n;
return mry[n]=f(n-1)+f(n-2);
}
signed main() {
f(30);
int n;
while(cin>>n){
cout<<mry[n]<<endl;
}
return 0;
}
1206:放苹果
#include<iostream>
#include<string>
using namespace std;
#define int long long
const int M=10,N=10;
int mry[M][N];
int f(int m,int n){
if(mry[m][n]) return mry[m][n];
if(m<=1||n<=1) return mry[m][n]=1;
if(m<n) return mry[m][n]=f(m,n-1);
return mry[m][n]=f(m-n,n)+f(m,n-1);
}
signed main() {
int t;cin>>t;
while(t--){
int m,n;cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}
1316:【例4.6】数的计数(Noip2001)
#include<iostream>
#include<string>
using namespace std;
#define int long long
const int N=1e3+10;
int cnt=1;
int m[N];
void f(int n){//6
//n/2-->3
if(m[n]) return;
m[n]=1;
for(int i=1;i<=n/2;i++){
f(i);
m[n]+=m[i];
}
}
//1.f(6) m[6]=1 f(1) m[6]=1+1+2+2 f(2) f(3)
//2.f(1) m[1]=1 end
//3.f(2) m[2]=1 f(1) m[2]=1+1
//4.f(3) m[3]=1 f(1) m[3]=1+1
signed main() {
int n;cin>>n;
f(n);
cout<<m[n]<<endl;
return 0;
}
1205:汉诺塔问题
#include <iostream>
using namespace std;
void hanoi(int n,char a,char b,char c){
if(n==1){
printf("%c->%d->%c\n",a,n,b);
return;
}
hanoi(n-1,a,c,b);
printf("%c->%d->%c\n",a,n,b);
hanoi(n-1,c,b,a);
}
int main(){
int n;
char a,b,c;
cin>>n>>a>>b>>c;
hanoi(n,a,b,c);
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
int ans = 1;
void f(int x, int d) {//分解x,从d开始分解
if (d >= x) return;//分解结束
for (int i = d; i <= sqrt(x); i++) {
if (x % i == 0) {//代表此时x可以分解
ans++;//分解即计数++
f(x / i, i);//i之前的已经分解完了,既然i是因子,后续都从i开始分解,同时要保证后续的分解大于等于之前的分解
}
}
}
signed main() {
int n; cin >> n;
for (int i = 1; i <= n; i++) {
int x; cin >> x;
ans = 1;//代表x本身是一种方案
f(x, 2);//将x从2开始分解
cout << ans << endl;
}
return 0;
}
#include <iostream>
using namespace std;
//状态f(n)为数字n所能分解质因子的种数
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
signed main(){
int n,a,b,c,d,t;cin>>n;
scanf("%d/%d",&a,&b);n--;
while(n--){
scanf("%d/%d",&c,&d);
a=a*d+b*c;
b=b*d;
t=gcd(a,b);
a=a/t;
b=b/t;
}
if(b==1) cout<<a<<endl;
else cout<<a<<'/'<<b;
return 0;
}