思路:本人比较菜,递推想了半天还是没看出来,去膜拜了一顿大佬,终于懂了。网上大部分都是递推+快速幂。然而我发现不用快速幂也可以水过,只需要把大数组换成char类型就可以卡过内存了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int L,M;
//用char型的话内存(30*10^6)B近似于30000KB < 32768KB
char dp[maxn][31];
void init(){
for(int i=1;i<=30;i++){
dp[1][i]=2;
dp[2][i]=4;
dp[3][i]=6;
dp[4][i]=9;
}
for(int i=5;i<maxn;i++){
for(int j=1;j<=30;j++){
/*
对于m结尾的串dp[i-1][j]
对于f结尾的串又分为mmff和mmf,对应
dp[i-4][j]和dp[i-3][j]
*/
dp[i][j]=(dp[i-1][j]+dp[i-3][j]+dp[i-4][j])%j;
}
}
}
int main(){
//freopen("in.txt","r",stdin);
init();
while(cin>>L>>M){
cout<<dp[L][M]%M<<endl;
}
return 0;
}