来源:HDU1021
这个题目其实很简单,但是我的答案和书上的答案不同,所以和大家分享。
书上答案是使用打表,但是实际上可以寻找循环节。。。
书上代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=1000010;
int d[MAXN];
void pre_solve()
{
int i;
d[0]=1;
d[1]=2;
for(i=2;i<1000000;i++)
d[i]=(d[i-1]%3+d[i-2]%3)%3;
}
int main(){
pre_solve();
int n;
while(scanf("%d",&n)!=EOF){
if(!d[n])puts("yes");
else puts("no");
}
return 0;
}
循环节:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n%4==2)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
本文详细解析了HDU1021问题的求解策略,通过寻找循环节而非单纯打表,优化了算法效率。提供了两种解题思路,包括一种基于循环节的高效解决方案,以及一种简洁的判断条件实现方式。
1371

被折叠的 条评论
为什么被折叠?



