C++_(矩阵)快速幂
2016-05-14 20:35
507 查看
#include <iostream> #include <cstdio> using namespace std; const int MOD = 1000; int POW(long long &num); int times; long long N; int main() { scanf("%d", ×); while(times--) { scanf("%lld", &N); printf("%d\n", POW(N)); } return 0; } int POW(long long &num) { int ans = 1; long long t = num; while(t) { if(t&1) { ans = (ans*num)%MOD; } num = num*num%MOD; t = t>>1; } return ans%10; }
一开始一个个相乘超时了最后发现可以用上面那个算法,A了
#include <iostream> #include <cstdio> #define MOD 10000 using namespace std; struct Matrix { int lt, rt, lb, rb; Matrix() : lt(1), rt(1), lb(1), rb(0){} Matrix& operator*(const Matrix m) { Matrix temp = (*this); lt = (temp.lt*m.lt)%MOD + (temp.rt*m.lb)%MOD; rt = (temp.lt*m.rt)%MOD + (temp.rt*m.rb)%MOD; lb = (temp.lb*m.lt)%MOD + (temp.rb*m.lb)%MOD; rb = (temp.lb*m.rt)%MOD + (temp.rb*m.rb)%MOD; return (*this); } }; long long n; int getAns(); int main() { while(~scanf("%lld", &n)) { if(n == -1) break; if(n == 0) { printf("0\n"); continue; } printf("%d\n", getAns()); } return 0; } int getAns() { Matrix m; n--; //long long t = n; Matrix res; Matrix temp; while(n) { if(n&1) { m= m * res; //cout << m.lt << " " << m.rt << endl << m.lb << " " << m.rb << endl; } res = res * res; //cout << res.lt << " " << res.rt << endl << res.lb << " " << res.rb << endl; n = n>>1; } return (m.rt)%MOD; }
相关文章推荐
- C++_FatMouse' Trade(贪心)
- 第7周 C语言程序设计(新2版) 例题 3个函数例题
- C++builder Property属性
- Java和C语言,C++语言主要差别
- C++ primer plus 第十章课后习题,原创答案。
- C++primer知识点(五)(终结C++primer)
- C++primer知识点(四)
- C++primer知识点(三)
- C++primer知识点(二)
- C++primer知识点(一)
- A*启发式搜索
- [C++]Random库--正态分布
- HDU 2955-Robberies(01背包变形)
- C++中的宏替换
- 第7周 C语言程序设计(新2版) 练习2-6/7/8 位运算符(不太理解)
- c++构造函数详解
- C++学习笔记:C++中的new
- 第7周 C语言程序设计(新2版) 练习2-5 返回最早出现匹配字符的位置
- C++ Namespace命名空间和static的用法总结
- c++;每周一些题(3)