大数
Hat's Fibonacci http://acm.hdu.edu.cn/showproblem.php?pid=1250
java
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main { 5 public static void main(String args[]){ 6 Scanner cin=new Scanner(System.in); 7 BigInteger dp[]=new BigInteger[10010]; 8 dp[1]=dp[2]=dp[3]=dp[4]=BigInteger.ONE; 9 for(int i=5;i<=10000;i++){ 10 dp[i]=dp[i-1]; 11 for(int j=2;j<=4;j++){ 12 dp[i]=dp[i].add(dp[i-j]); 13 } 14 } 15 while(cin.hasNext()){ 16 int n=cin.nextInt(); 17 System.out.println(dp[n]); 18 } 19 } 20 }
高精度,存不了,只能递推算
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=2020; 7 class Hp { //高精度类 8 int len,s[M]; 9 public: 10 void init() { 11 len=1; 12 mt(s,0); 13 } 14 void init(char ch[]) { 15 len=1; 16 mt(s,0); 17 int i=0; 18 while(ch[i]=='0'&&ch[i]!=0) i++; 19 if(ch[i]!=0) { 20 len=strlen(ch)-i; 21 for(i=0; i<len; i++) { 22 s[i]=ch[len-i-1]-48; 23 } 24 } 25 } 26 void init(int x) { 27 len=1; 28 mt(s,0); 29 while(x) { 30 s[len-1]=x%10; 31 x/=10; 32 if(x) len++; 33 } 34 } 35 void init(const Hp& a) { 36 len=a.len; 37 for(int i=0; i<M; i++) { 38 s[i]=a.s[i]; 39 } 40 } 41 void print() { //输出 42 int i=len-1; 43 while(s[i]==0&&i>0) i--; 44 for(; i>=0; i--) { 45 printf("%d",s[i]); 46 } 47 } 48 int cmp(Hp a) { //比较,类似于char数组比较 49 if(len<a.len) return -1; 50 else if(len>a.len) return 1; 51 else { 52 int temp=len-1; 53 while(temp>=0&&s[temp]==a.s[temp]) temp--; 54 if(temp==-1) return 0; 55 else if(s[temp]<a.s[temp]) return -1; 56 else return 1; 57 } 58 } 59 void add(Hp a) { //高精度与高精度相加 60 int templen=max(len,a.len); 61 for(int i=0; i<templen; i++) { 62 s[i]+=a.s[i]; 63 if(s[i]>9) { 64 s[i]-=10; 65 s[i+1]++; 66 } 67 } 68 len=templen; 69 if(s[len]!=0) len++; 70 } 71 void add(int x) { //高精度加单精度 72 int temp=0; 73 s[0]+=x; 74 while(s[temp]>9) { 75 s[temp]-=10; 76 temp++; 77 s[temp]++; 78 } 79 if(s[len]!=0) len++; 80 } 81 void subtract(Hp a) { //高精度减高精度 82 for(int i=0; i<len; i++) { 83 s[i]-=a.s[i]; 84 if(s[i]<0) { 85 s[i]+=10; 86 s[i+1]--; 87 } 88 } 89 while(len>1&&s[len-1]==0) len--; 90 } 91 void multiply10() { //高精度乘10 92 for(int i=len-1; i>=0; i--) { 93 s[i+1]=s[i]; 94 } 95 len++; 96 if(s[len-1]==0) len--; 97 } 98 void multiply(int b) { //高精度乘单精度 99 int temp=0; 100 for(int i=0; i<len; i++) { 101 temp+=s[i]*b; 102 s[i]=temp%10; 103 temp/=10; 104 } 105 s[len++]=temp; 106 while(s[len-1]>10) { 107 s[len]+=s[len-1]/10; 108 s[len-1]%=10; 109 len++; 110 } 111 while(len>1&&s[len-1]==0) len--; 112 } 113 void multiply(Hp b) { //高精度乘高精度 114 Hp c; 115 mt(c.s,0); 116 for(int i=0; i<len; i++) { 117 for(int j=0; j<b.len; j++) { 118 c.s[i+j]+=s[i]*b.s[j]; 119 c.s[i+j+1]+=c.s[i+j]/10; 120 c.s[i+j]%=10; 121 } 122 } 123 len=len+b.len; 124 for(int i=0; i<len; i++) { 125 s[i]=c.s[i]; 126 } 127 while(len>1&&s[len-1]==0) len--; 128 } 129 int divide(int b) { //高精度除单精度 130 int ret=0; 131 for(int i=len-1; i>0; i--) { 132 s[i-1]+=(s[i]%b)*10; 133 s[i]/=b; 134 } 135 ret=s[0]%b; 136 s[0]/=b; 137 while(len>1&&s[len-1]==0) len--; 138 return ret; 139 } 140 Hp divide(Hp b) { //高精度除高精度 141 Hp c,d; 142 mt(c.s,0); 143 mt(d.s,0); 144 d.len=1; 145 for(int i=len-1; i>=0; i--) { 146 d.multiply10(); 147 d.s[0]=s[i]; 148 while(d.cmp(b)>=0) { 149 d.subtract(b); 150 c.s[i]++; 151 } 152 } 153 for(int i=0; i<len; i++) { 154 s[i]=c.s[i]; 155 } 156 while(len>1&&s[len-1]==0) len--; 157 while(d.len>1&&d.s[d.len-1]==0) d.len--; 158 return d; 159 } 160 } dp[8]; 161 int main() { 162 int n; 163 while(~scanf("%d",&n)){ 164 if(n<5){ 165 puts("1"); 166 continue; 167 } 168 dp[1].init(1); 169 dp[2].init(1); 170 dp[3].init(1); 171 dp[4].init(1); 172 for(int i=5;i<=n;i++){ 173 dp[5].init(dp[4]); 174 for(int j=1;j<=3;j++){ 175 dp[5].add(dp[j]); 176 } 177 for(int j=1;j<=4;j++){ 178 dp[j].init(dp[j+1]); 179 } 180 } 181 dp[5].print(); 182 puts(""); 183 } 184 return 0; 185 }
end