题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099
思想很容易想到
就是预处理出前10w个的fib数,然后建树查询
建树时只用前40位即可,所以在计算时只用截取前60位
但是我在截取时总是出错
后来看了别人的代码改了一下就对了
不过还是不知道为什么那样是对的
更改地方在代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #define maxn 110 6 using namespace std; 7 char s[60]; 8 char c[100]; 9 char s1[maxn],s2[maxn],s3[maxn]; 10 void add(char *s1,char *s2, char *s3)//大数加 11 { 12 int len1=strlen(s1)-1; 13 int len2=strlen(s2)-1; 14 int up=0; 15 int x=0,y=0; 16 int k=0; 17 int z=0; 18 while(len1>=0 || len2>=0) 19 { 20 if(len1<0) x=0; 21 else x=s1[len1]-'0'; 22 if(len2<0) y=0; 23 else y=s2[len2]-'0'; 24 25 z=x+y+up; 26 27 c[k++]=z%10+'0'; 28 up=z/10; 29 len1--; 30 len2--; 31 } 32 33 if(up>0) c[k++]=up+'0'; 34 for(int i=0;i<k;i++) 35 s3[i]=c[k-1-i]; 36 s3[k]='