Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
解答:
int Fibonacci(int n){
if(n==1){
return 1 % 10007;
}else if(n==2){
return 1 % 10007;
}else{
return (Fibonacci(n-1)+Fibonacci(n-2)) % 10007;
}
}
int main() {
int n=0;
cin>>n;
cout<<Fibonacci(n);
return 0;
}
本题可以用递归实现,正当我觉得这道题简单的时候,一提交,居然才得了30分。晕,一看超时了,n>50就运算不出来了。不得已,我只好根据提示,按照参考方法来编写,一运行发现快了还真的不止一点半点。代码如下:
int F[1000001];
int Fibonacci(int n){
if(n<=2){
return 1;
}
else{
F[1]=F[2]=1%10007;
for(int i=3;i<=n;i++){
F[i]=(F[i-1]+F[i-2])%10007;
}
return F[n];
}
}
int main() {
int n=0;
std::cin>>n;
std::cout<<Fibonacci(n);
return 0;
}
所以本题有以下几个技巧:
1.用递归可能会简单,但是耗时可能会很大(具体原因还没去思考),可以采取保存前一步计算的值来缩短计算时间
2.相加取mod和分别取mod再相加再取mod的值是相等的,具体为:(a+b)%n=(a%n+b%n)%n,如此一来就不需要保存精确的Fibonacci数了,直接保存取模后的之就可以了,这样比较省内存,也不需要保存很大的值。
入门题的第一题我都没有做出来,出门就被秒了。。。
说明:在本题中,输入是一个整数,但是输出是一个实数。
对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。
实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。
这道题比较简单,PI也给出来了,重点就在于控制输出小数位数,关于这个知识点我忘了,我又被秒了。于是只好上网查资料。
#include<iostream>
#include <iomanip>
using namespace std;
const double PI=3.14159265358979323;
int main() {
int r=0;
cin>>r;
cout << fixed <<setprecision(7) <<PI*r*r;
return 0;
}
如果不加fixed则精度为7为数,即包括整数部分一共7位数,加入fixed则保留小数点后7位数。保留小数需要引入新的头文件<iomainp>,如果实在记不得,就用c语言的printf吧。
#include<stdio.h>
const double PI=3.14159265358979323;
int main() {
int r=0;
scanf("%d",&r);
printf("%.7f",PI*r*r);
return 0;
}
说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。
一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。
说明:请注意这里的数据规模。
本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。
本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。
如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。
解答:
1.题目已经提示的很清楚了用循环可能会超时
2.需要使用long long int 来保存数据
所以就用数学知识求出Sn=n*(1+n)/2,然后再用程序计算即可。这道题很可能是提醒我们在以后的解题过程中也很可能会借助数学知识来求解。
#include<iostream>
using namespace std;
int main() {
long long int n=0;
cin>>n;
cout<<n*(1+n)/2;
return 0;
}
说明:“输入格式”是描述在测试你的程序时,所给的输入一定满足的格式。
做题时你应该假设所给的输入是一定满足输入格式的要求的,所以你不需要对输入的格式进行检查。多余的格式检查可能会适得其反,使用你的程序错误。
在测试的时候,系统会自动将输入数据输入到你的程序中,你不能给任何提示。比如,你在输入的时候提示“请输入A、B”之类的话是不需要的,这些多余的输出会使得你的程序被判定为错误。
说明:“输出格式”是要求你的程序在输出结果的时候必须满足的格式。
在输出时,你的程序必须满足这个格式的要求,不能少任何内容,也不能多任何内容。如果你的内容和输出格式要求的不一样,你的程序会被判断为错误,包括你输出了提示信息、中间调试信息、计时或者统计的信息等。
说明:“样例输入”给出了一组满足“输入格式”要求的输入的例子。
这里给出的输入只是可能用来测试你的程序的一个输入,在测试的时候,还会有更多的输入用来测试你的程序。
说明:“样例输出”给出了一组满足“输出格式”要求的输出的例子。
样例输出中的结果是和样例输入中的是对应的,因此,你可以使用样例的输入输出简单的检查你的程序。
要特别指出的是,能够通过样例输入输出的程序并不一定是正确的程序,在测试的时候,会用很多组数据进行测试,而不局限于样例数据。有可能一个程序通过了样例数据,但测试的时候仍只能得0分,可能因为这个程序只在一些类似样例的特例中正确,而不具有通用性,再测试更多数据时会出现错误。
比如,对于本题,如果你写一个程序不管输入是什么都输入57,则样例数据是对的,但是测试其他数据,哪怕输入是1和2,这个程序也输出57,则对于其他数据这个程序都不正确。
说明:“数据规模与约定”中给出了试题中主要参数的范围。
这个范围对于解题非常重要,不同的数据范围会导致试题需要使用不同的解法来解决。比如本题中给的A、B范围不大,可以使用整型(int)来保存,如果范围更大,超过int的范围,则要考虑其他方法来保存大数。
有一些范围在方便的时候是在“问题描述”中直接给的,所以在做题时不仅要看这个范围,还要注意问题描述。
解答:
看到这题我郁闷了,原来我题目顺序做反了。。。
这题主要是考查输入与输出
#include<iostream>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}
好了,入门篇就此完成了,希望我这样一边做题一边记录有点效果,下次有空就从基础练习开始!