什么都不说了,矩阵乘法加速dp f(i) = f(i-1) + 2*f(i-2) + 1 // time: 2011年4月10日14:08:21 // prog: fzu 1810 // algorithm: dp,矩阵乘法 #include <cstdio> #define MAX_SIZE 3 #define MOD 200907 using namespace std; class CMatrix { public: long long element[MAX_SIZE][MAX_SIZE]; void setSize(int); void setModulo(int); CMatrix operator* (CMatrix); CMatrix power(int); private: int size; long modulo; }; void CMatrix::setSize(int a) { for (int i=0; i<a; i++) for (int j=0; j<a; j++) element[i][j]=0; size = a; } void CMatrix::setModulo(int a) { modulo = a; } CMatrix CMatrix::operator* (CMatrix param) { CMatrix product; product.setSize(size); product.setModulo(modulo); for (int i=0; i<size; i++) for (int j=0; j<size; j++) { for (int k=0; k<size; k++) { product.element[i][j]+=element[i][k]*param.element[k][j]; product.element[i][j]%=modulo; } } return product; } CMatrix CMatrix::power(int exp) { CMatrix tmp = (*this) * (*this); if (exp==1) return *this; else if (exp & 1) return tmp.power(exp/2) * (*this); else return tmp.power(exp/2); } CMatrix marorg,mara; void ini() { long long iniorg[][3] ={ {1,0,0}, {1,0,0}, {2,0,0} }; long long inia[][3] ={ {1,0,0}, {0,0,1}, {1,2,1} }; // 初始化原始数据 marorg.setSize(3); marorg.setModulo(MOD); for(int i = 0; i < 3; ++i) for(int j = 0; j < 3; ++j) marorg.element[i][j] = iniorg[i][j]; // 初始化要幂的矩阵 mara = marorg; for(int i = 0; i < 3; ++i) for(int j = 0; j < 3; ++j) mara.element[i][j] = inia[i][j]; } long long solve(int n) { if(n <= 2) { return n; } else { CMatrix marres = mara.power(n - 2) * marorg; return marres.element[2][0]; } } int main() { int n; ini(); while(scanf("%d", &n), n) { printf("%lld/n", solve(n)); } return 0; } // f(i) = f(i-1) + 2*f(i-2) + 1