Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
整個template全盤照抄過了#include <utility> #include <iostream> #undef minor template<class T, T mod> class Modular { public: Modular() : value() {} Modular(const Modular &x) : value(x.value) {} Modular(T x) { while (x < 0) { x += mod; } value = x % mod; } // use the default operator= Modular &operator+=(const Modular &x) { value += x.value; value %= mod; return *this; } Modular &operator-=(const Modular &x) { value += mod; value -= x.value; value %= mod; return *this; } Modular &operator*=(const Modular &x) { value *= x.value; value %= mod; return *this; } Modular &operator/=(const Modular &x) { return *this *= ~x; } Modular operator+() const { return *this; } Modular operator-() const { return 0 - *this; } Modular operator~() const { } Modular &operator++() { ++value; value %= mod; return *this; } Modular &operator--() { value += mod; --value; value %= mod; return *this; } Modular operator++(int) { Modular c = *this; ++*this; return c; } Modular operator--(int) { Modular c = *this; --*this; return c; } operator T() const { return value; } operator bool() const { return value; } private: T value; static std::pair<T, T> egcd(const T &a, const T &b) { if (!b) return std::pair<T, T>(1, 0); T q, r; std::pair<T, T> res; q = a / b; r = a % b; res = egcd(b, r); return std::pair<T, T>(res.second, res.first - q * res.second); } }; template<class T, T mod> Modular<T, mod> operator+(const Modular<T, mod> &a, const Modular<T, mod> &b) { Modular<T, mod> c = a; return c += b; } template<class T, T mod> Modular<T, mod> operator-(const Modular<T, mod> &a, const Modular<T, mod> &b) { Modular<T, mod> c = a; return c -= b; } template<class T, T mod> Modular<T, mod> operator*(const Modular<T, mod> &a, const Modular<T, mod> &b) { Modular<T, mod> c = a; return c *= b; } template<class T, T mod> Modular<T, mod> operator/(const Modular<T, mod> &a, const Modular<T, mod> &b) { Modular<T, mod> c = a; return c /= b; } template<class T, unsigned n, unsigned m> struct Matrix { public: Matrix() : data() { } Matrix(const Matrix<T, n, m> &x) { for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < m; ++j) { data[i][j] = x[i][j]; } } } // use the default operator= Matrix<T, n, m> &operator+=(const Matrix<T, n, m> &x) { for (unsigned i=0; i<n; ++i) { for (unsigned j=0; j<n; ++j) { data[i][j] += x[i][j]; } } return *this; } Matrix<T, n, m> &operator-=(const Matrix<T, n, m> &x) { for (unsigned i=0; i<n; ++i) { for (unsigned j=0; j<n; ++j) { data[i][j] -= x[i][j]; } } return *this; } Matrix<T, n, m> &operator*=(const T &x) { for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < m; ++j) { data[i][j] *= x; } } return *this; } Matrix<T, n, m> &operator/=(const T &x) { for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < m; ++j) { data[i][j] /= x; } } return *this; } template<unsigned p> Matrix<T, n, p> operator*(const Matrix<T, m, p> &x) const { Matrix<T, n, p> ans; for(unsigned i=0; i<n; ++i) { for (unsigned j=0; j<p; ++j) { ans[i][j] = 0; for (unsigned k=0; k<m; ++k) { ans[i][j] += data[i][k] * x[k][j]; } } } return ans; } T (&operator[](unsigned index))[m] { return data[index]; } const T (&operator[](unsigned index) const)[m] { return data[index]; } Matrix<T, m, n> transpose() const { Matrix<T, m, n> ans; for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < m; ++j) { ans[j][i] = data[i][j]; } } return ans; } private: T data[n][m]; }; template<class T, unsigned n, unsigned m> Matrix<T, n, m> operator+(const Matrix<T, n, m> &x, const Matrix<T, n, m> &y) { Matrix<T, n, m> t = x; t+=y; return t; } template<class T, unsigned n, unsigned m> Matrix<T, n, m> operator-(const Matrix<T, n, m> &x, const Matrix<T, n, m> &y) { Matrix<T, n, m> t = x; t-=y; return t; } template<class T, unsigned n, unsigned m> Matrix<T, n, m> operator*(const Matrix<T, n, m> &x, const T &y) { Matrix<T, n, m> t = x; t*=y; return t; } template<class T, unsigned n, unsigned m> Matrix<T, n, m> operator*(const T &y, const Matrix<T, n, m> &x) { return x * y; } template<class T, unsigned n, unsigned m> Matrix<T, n, m> operator/(const Matrix<T, n, m> &x, const T &y) { Matrix<T, n, m> t = x; t/=y; return t; } template<class T, unsigned n> struct Square_matrix : public Matrix<T, n, n> { public: Square_matrix() { } Square_matrix(const Matrix<T, n, n> &x) : Matrix<T, n, n>(x) { } Square_matrix(const T &x) { for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < n; ++j) { (*this)[i][j] = (i == j ? x : T(0)); } } } Square_matrix<T, n-1> minor(unsigned x, unsigned y) const { Square_matrix<T, n-1> ans; for (unsigned i = 0; i < n-1; ++i) { for (unsigned j = 0; j < n-1; ++j) { ans[i][j] = (*this)[i<x ? i : i+1][j<y ? j : j+1]; } } return ans; } Square_matrix operator*=(const Square_matrix &x) { return *this = *this * x; } T cofactor(unsigned x, unsigned y) const { return (((x+y)%2)?-1:1) * minor(x, y).determinant(); } T determinant() const { T ans=0; for (unsigned i = 0; i < n; ++i) { ans += (*this)[0][i] * cofactor(0, i); } return ans; } Square_matrix<T, n> adjoint() const { Square_matrix ans; for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < n; ++j) { ans[j][i] = cofactor(i, j); } } return ans; } Square_matrix<T, n> inverse() const { return adjoint() / determinant(); } }; template<class T> struct Square_matrix<T, 0> : public Matrix<T, 0, 0> { public: Square_matrix() { } Square_matrix(const Matrix<T, 0, 0> &x) : Matrix<T, 0, 0>(x) { } T determinant() const { return 1; } Square_matrix<T, 0> adjoint() const { return Square_matrix<T, 0>(); } Square_matrix<T, 0>inverse() const { return Square_matrix<T, 0>(); } }; template<class T> T pow(T a, unsigned b) { T ans(1); while (b) { if (b % 2) { ans *= a; --b; } a *= a; b /= 2; } return ans; } int main() { int n; std::cin >> n; while (n != -1) { Square_matrix<Modular<unsigned, 10000>, 2> a; a[0][0] = 1; a[0][1] = 1; a[1][0] = 1; a[1][1] = 0; Square_matrix<Modular<unsigned, 10000>, 2> ans = pow(a, n); std::cout << unsigned(ans[0][1]) << '\n'; std::cin >> n; } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator