面向对象手法解OJ题

Introduction

这个也是我给我们学校C++课程出的一个题,本来是个很简单的题目。。
为了考语法暴力面向对象。。。出的我自己都恶心的不行不行得了。
帮我检查bug的NOI大神看了以后表示“写的太好看了,我都看不懂了”。。

唉。。引用Linus Torvalds大神的一句名言

Talk is cheap. Show me the code.

多说无益,放码过来。

–Linus Torvalds

我就直接放码了。原题是个程序挖空的题,此处我就已经填好啦

题目描述

兔子是繁殖能力很强的生物。现在我们有一对兔子,每1个月后它们会生下一对小兔子。小兔子1个月后会长成成年兔子,之后每1个月它们也会生下一对小兔子。

现在假设所有兔子都永远不会死,问INT_MAX-1个月后有多少对兔子呢?结果只需输出最后4位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <climits>
using namespace std;
template <class T>
class Matrix {
public:
int m,n;
T** data;
Matrix(int m, int n, const T &value):m(m),n(n) {
data=new T*[m];
for(int i=0; i<m; i++)
data[i]=new T[n];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
data[i][j]=value;
}
Matrix<T> operator%(int a) {
Matrix<T> result(m,n,0);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
result[i][j]=data[i][j]%a;
return result;
}
Matrix<T> operator*(Matrix<T> a) {
Matrix<T> result(m,a.n,0);
for(int i=0; i<m; i++)
for(int j=0; j<a.n; j++)
for(int k=0; k<n; k++)
result[i][j]+=data[i][k]*a[k][j]%10000;
return result;
}
T* operator[](int i) {
return data[i];
}
};
template <class T>
class squareMatrix:public Matrix<T> {
public:
squareMatrix(int n,const T value): Matrix<T>(n,n,value) {}
squareMatrix(const Matrix<T> &a):Matrix<T>(a.m<a.n?a.m:a.n,a.m<a.n?a.m:a.n,0) {
for(int i=0; i<Matrix<T>::m; i++)
for(int j=0; j<Matrix<T>::m; j++)
Matrix<T>::data[i][j]=a.data[i][j];
}
squareMatrix<T> operator^(int a) {
squareMatrix<T> p(this->operator*(*this));
if(a>1)
if(a%2)
return this->operator*(p^(a/2))%10000;
else
return p^(a/2)%10000;
else
return *this;
}
};
int main() {
squareMatrix<int> a(2,1);
a[1][1]=0;
cout<<(a^INT_MAX)[0][0]<<endl;
}