e-olymp
favorite We need a little bit of your help to keep things running, click on this banner to learn more
Problems

Factorial!

published at 5/5/15, 10:54:32 am

Что за странные тесты

published at 2/3/16, 12:36:49 am

Я перепробовал всё что знал, и ничего полностью не работает

published at 10/10/17, 11:10:18 pm

Походу тут використовується метод довгої арифметики.

published at 5/23/18, 1:45:24 pm

Плюсую коментар вище

published at 9/5/18, 10:57:11 pm

С тестами все нормально, просто попробуйте посчитать факториал 30 и посмотрите какое максимальное число может вместить тот тип данных который вы используете

published at 4/5/19, 12:56:24 am

Тобто на паскалі цю задачу неможливо розв'язати?

published at 1/25/20, 10:39:42 am

include <bits/stdc++.h>

using namespace std;

class BigInteger { private: enum{MAXLENGTH = 100000}; int m[MAXLENGTH]; int len;

public: BigInteger(int n) { memset(m,0,sizeof(m)); len = 0; if (n == 0) len++; while (n > 0) { m[len++] = n % 10000; n = n / 10000; } }

BigInteger(string s) { int i, j; len = (int)s.length(); memset(m,0,sizeof(m)); for(i = 1; i <= len / 4; i++) sscanf(s.c_str() + len - i * 4,"%4d",&m[i-1]); i--; m[i] = 0; for(j = 0; j < len - i * 4; j++) m[i] = m[i] * 10 + s[j] - '0'; len = (len + 3) / 4; }

BigInteger(void) { memset(m,0,sizeof(m)); len=1; }

void print(void) { int temp = len - 1; printf("%d",m[temp--]); while(temp>=0) { if (m[temp] < 1000) printf("0"); if (m[temp] < 100) printf("0"); if (m[temp] < 10) printf("0"); printf("%d",m[temp--]); } }

BigInteger operator+ (const BigInteger &a) { int i,carry = 0; BigInteger Temp(*this); if (a.len > Temp.len) Temp.len = a.len; for(i = 0; i < Temp.len; i++) { Temp.m[i] += (a.m[i] + carry); carry = Temp.m[i] / 10000; Temp.m[i] %= 10000; } if (carry > 0) {Temp.m[i] = carry; Temp.len++;} return Temp; }

BigInteger operator+ (int a) { BigInteger Temp(*this); int i, carry = a; for(i = 0; i < Temp.len; i++) { Temp.m[i] = Temp.m[i] + carry; carry = Temp.m[i] / 10000; Temp.m[i] = Temp.m[i] % 10000; } while (carry > 0) { Temp.m[i++] = carry % 10000; carry /= 10000; Temp.len++; } return Temp; }

BigInteger operator- (const BigInteger &a) { BigInteger Temp(*this); int i,carry = 0; for(i = 0; i < Temp.len; i++) { Temp.m[i] = Temp.m[i] - a.m[i] - carry; if (Temp.m[i] < 0) { Temp.m[i] = Temp.m[i] +10000; carry = 1; } else carry = 0; } while (!Temp.m[Temp.len-1] && (Temp.len > 1)) Temp.len--; return Temp; }

BigInteger operator- (int a) { BigInteger Temp(*this); int i, carry = a; for(i = 0; i < Temp.len; i++) { Temp.m[i] = Temp.m[i] - carry % 10000; carry = carry / 10000; if (Temp.m[i] < 0) { carry++; Temp.m[i]+=10000;} } while (Temp.m[Temp.len-1] == 0) Temp.len--; return Temp; }

BigInteger operator* (int a) { BigInteger Temp(0); int i, t, carry = 0; Temp.len = len; for(i = 0; i < Temp.len; i++) { t = a * m[i] + carry; Temp.m[i] = t % 10000; carry = t / 10000; } while (carry > 0) {Temp.m[i++] = carry % 10000; carry /= 10000; Temp.len++;} return Temp; }

BigInteger operator* (const BigInteger &a) { BigInteger Temp(0); int i, j, t, carry; for(i = 0; i < len; i++) { carry = 0; for(j = 0; j < a.len; j++) { t = Temp.m[i + j] + m[i] * a.m[j] + carry; Temp.m[i + j] = t % 10000; carry = t / 10000; } Temp.m[i + a.len] = carry; } Temp.len = len + a.len; while ((Temp.m[Temp.len - 1] == 0) && (Temp.len > 1)) Temp.len--; return Temp; }

BigInteger Factorial(int a) { int i; BigInteger Temp(1); for(i = 2; i <= a; i++) Temp = Temp * i; return Temp; }

BigInteger operator/ (int a) { BigInteger Temp(0); int i, ost = 0; for(i = len - 1; i >= 0; i--) { ost = ost * 10000 + m[i]; Temp.m[i] = ost / a; ost = ost % a; } Temp.len = len; while(Temp.m[Temp.len-1] == 0) Temp.len--; return Temp; }

int operator< (const BigInteger &a) { int i; if (len < a.len) return 1; if (len > a.len) return 0; for(i = len - 1; (m[i] == a.m[i]) && (i>0); i--); if (m[i] < a.m[i]) return 1; return 0; }

int operator>= (const BigInteger &a) { return !(*this < a); }

int operator> (const BigInteger &a) { int i; if (len > a.len) return 1; if (len < a.len) return 0; for(i=len-1;(m[i] == a.m[i]) && (i>0);i--); if (m[i] > a.m[i]) return 1; return 0; }

int operator<= (const BigInteger &a) { return !(*this > a); }

int operator== (const BigInteger &a) { int i; if (len != a.len) return 0; for(i = len-1;i>=0;i--) if (m[i] != a.m[i]) return 0; return 1; }

int operator!= (const BigInteger &a) { return !(*this == a); }

BigInteger operator/ (const BigInteger &div) { BigInteger a(0),b(*this),t(div); if (t == BigInteger(1)) return *this; if (t > b) return a; while(a < b) { t = (a + b) / 2; if (t == a) break; if (t*div > (*this)) b = t; else a = t; } return a; }

BigInteger mod (const BigInteger &div) { BigInteger Temp(*this); Temp = *this - (Temp/div)*div; return Temp; }

BigInteger SqrtBin() { BigInteger a(0),b(*this),t; if ((len == 1) && (m[0] == 1)) return BigInteger(1); while (a < b) { t = (a + b) / 2; if (t == a) break; if (t*t > (*this)) b = t; else a = t; } return a; }

int Odd() { if (len > 0) return (m[len - 1] % 2 == 1); return 0; } };

BigInteger Zero(0); BigInteger GCD(BigInteger a, BigInteger b) { if (b > Zero) return GCD(b,a.mod(b)); return a; }

BigInteger _CnkRes(1); BigInteger Cnk(int k, int n) { int i; if (k > n - k) k = n - k; _CnkRes = BigInteger(1); for(i = 1; i <= k; i++) _CnkRes = _CnkRes * (n - i + 1) / i; return _CnkRes; }

BigInteger PowMod(BigInteger a, BigInteger n, BigInteger m) { if (n == BigInteger(1)) return a; //a.print();printf("\n"); //n.print();printf("\n"); BigInteger a2 = a * a; a2 = a2.mod(m); if (n.Odd()) { a2 = a * PowMod(a2, n / 2, m); return a2.mod(m); } return PowMod(a2, n / 2, m); }

int main() { BigInteger ans(1); int n; cin >> n; for (int i=2;i<=n;i++) ans = ans * i; ans.print(); return 0; }