题解 P5004 【专心OI - 跳房子】
PS:本题目题解涉及到的矩阵表示方法可能有点问题……凑和着看吧
本题受 [SCOI2005]互不侵犯启发而出
题目简化一下……把
题目没出
10pts dfs爆搜
#include<iostream>
#include<cstdio>
#define max(a,b) (a>b?a:b)
long long n,m;
#define mod (1000000007)
int cnt;
void dfs(int now){
if(now>n){
if(cnt==mod) cnt=0;
++cnt;
return;
}
if(now+m+1>n){
if(cnt==mod) cnt=0;
++cnt;
return ;
}
for(register int i=max(1,now+1+m);i<=n+1;++i)
dfs(i);
}
int main(){
scanf("%lld%lld",&n,&m);
dfs(-20);
printf("%d",cnt);
return 0;
}
顺带收获
这是找规律好题鸭!
20pts 考虑M=1,N<=10^7
是否发现什么奥秘?
然而就是斐波那契数列……
scanf("%lld%lld",&n,&m);
long long a=2,b=3,c=0;
for(register int i=1;i<n;++i){
c=a+b;
c%=mod;
a=b,b=c;
}
printf("%lld",a);
这20分爽吧
30pts 矩阵优化一波
这样应该可以过
不会矩阵乘法?洛谷有优质的模板1,模板2去看题解吧!
50pts 让我们继续找规律
再看看
您可以发现前
好玩吧?
您也可以自己寻找
不知道这些数学符号对不对呀…………我只是个初中生
(如果您是递归做的只有
100pts 继续矩阵优化
矩阵的大小和数值随
原矩阵为
乘一遍矩阵应该变成
下面讨论用来乘的矩阵
可以发现
规律很明显了
这个斜率为
您也许可以写个dp,但是不知道多少分
然后搞矩阵快速幂即可