// High-precision calculation + formula recursion <br/> // when M = 1, ANS = 2 ^ d; <br/> // when m> 1, f [1] = 1, F [2] = 2 .... f [m] = M, F [M + 1] = f [m] + F [1] ...... f [N] = f [n-1] + F [n-M]; <br/> # include <iostream> <br/> # include <string> <br/> # include <vector> <br/> # include <algorithm> <br/> using namespace STD; <br/> struct bigint <br/> {<br/> string num; <br/> bigint (int n) <br/>{< br/> while (n! = 0) <br/>{< br/> num. push_back (N % 10 + '0'); <br/> N/= 10; <br/>}< br/> reverse (Num. begin (), num. end (); <br/>}< br/>}; <br/> int compare (string a, string B) <br/>{< br/> If (. size ()> B. size () return 1; <br/> else if (. size () <B. size () Return-1; <br/> elsereturn. compare (B); <br/>}< br/> string add (string num1, string num2) <br/>{< br/> int Len = max (num1.size (), num2.size () + 1; <br/> string ans; <br/> Ans. assign (Len, 0); <br/> reverse (num1.begin (), num1.end (); <br/> reverse (num2.begin (), num2.end ()); <br/> num1.append (len-num1.size (), '0'); <br/> num2.append (len-num2.size (), '0 '); </P> <p> for (INT I = 0; I <Len; ++ I) <br/> {<br/> ans [I] + = num1 [I]-'0' + num2 [I]-'0 '; <br/> ans [I + 1] + = ans [I]/10; <br/> ans [I] % = 10; <br/> ans [I] + = '0'; <br/>}< br/> while (ANS [len-1] = '0' & ANS. size ()! = 1) // remove the leading zero. When the two numbers are equal, retain 0 <br/>{< br/> ans. erase (len-1, 1); <br/> Len --; <br/>}< br/> reverse (ans. begin (), ans. end (); <br/> return ans; <br/>}< br/> string multiply (string num1, string num2) <br/>{< br/> int Len = num1.size () + num2.size (); <br/> string ans; <br/> ans. assign (Len, 0); <br/> reverse (num1.begin (), num1.end (); <br/> reverse (num2.begin (), num2.end ()); <br/> for (INT I = 0; I <num2.size (); ++ I) <br/> {<br/> For (Int J = 0; j <num1.size (); ++ J) <br/> {<br/> ans [I + J] + = (num2 [I]-'0') * (num1 [J]-'0 '); <br/> ans [I + J + 1] + = ans [I + J]/10; <br/> ans [I + J] % = 10; <br/>}< br/> for (INT I = 0; I <Len; ++ I) ans [I] + = '0 '; <br/> while (ANS [len-1] = '0' & ANS. size ()! = 1) // remove the leading zero. When the two numbers are equal, retain 0 <br/>{< br/> ans. erase (len-1, 1); <br/> Len --; <br/>}< br/> reverse (ans. begin (), ans. end (); <br/> return ans; <br/>}< br/> int main () <br/>{< br/> int M, D; <br/> while (CIN> m> D & M! = 0) <br/>{< br/> If (M = 1) <br/>{< br/> bigint ans (1 ); <br/> bigint factor (2); <br/> for (INT I = 1; I <= D; ++ I) <br/> {<br/> ans. num = multiply (ans. num, factor. num); <br/>}< br/> cout <ans. num <Endl; <br/>}< br/> else <br/>{< br/> vector <string> V; <br/> for (INT I = 1; I <= m; ++ I) <br/>{< br/> bigint A (I ); <br/> v. push_back (. num); <br/>}< br/> for (INT I = 0; I <= 100; ++ I) <br/>{< br/> If (v. size ()> d) break; <br/> v. push_back (add (V [I], V [I + s-1]); <br/>}< br/> cout <V [d] <Endl; <br/>}< br/> return 0; <br/>}< br/>