Light OJ 1132 Summing up Powers 矩阵快速幂
来源:互联网 发布:react.js控制 隐藏div 编辑:程序博客网 时间:2024/05/17 22:27
题目大意:
给出 N,k, 1 <= N <= 10^15, 0 <= k <= 50;
求( 1^k + 2^k + ... + N^k) mod (2^32) 的值
大致思路:
是个很明显的矩阵快速幂的题吧, 之前学长推荐过这道题,现在居然正好碰到了
不过刚开始一直因为 %lld 和 %I64d 的原因WA了3次..以后还是要注意OJ上的FAQ的问题...
设S(n) = sigma(i^k) mod (2^32) i 从1到n
这道题的关键就是发现这样的转换关系:
这样转换矩阵当中的数之和K有关,这样就好办了
直接用快速幂,最后得到的S(n)就是答案
代码如下:
Result : Accepted Memory : 1716 KB Time : 1724 ms
/* * Author: Gatevin * Created Time: 2014/7/29 18:29:03 * File Name: test.cpp */#include<iostream>#include<sstream>#include<fstream>#include<vector>#include<list>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cctype>#include<cmath>#include<ctime>#include<iomanip>using namespace std;const double eps(1e-8);typedef long long lint;lint k,siz;lint n;const lint mod = ((long long)1 << 32);lint C[60][60];struct Matrix{ lint a[53][53]; Matrix() { memset(a, 0, sizeof(a)); for(int i = 1; i <= 52; i++) { a[i][i] = 1LL; } }};Matrix operator * (const Matrix & m1, const Matrix & m2){ Matrix m; for(int i = 1; i <= siz; i++) { for(int j = 1; j <= siz; j++) { m.a[i][j] = 0; for(int k = 1; k <= siz; k++) { m.a[i][j] = (m.a[i][j] + (m1.a[i][k] * m2.a[k][j]) % mod) % mod; } } } return m;}Matrix quick_pow(Matrix base, lint pow){ Matrix I; while(pow) { if(pow & 1) { I = I * base; } base = base * base; pow >>= 1; } return I;}int main(){ lint t; memset(C, 0, sizeof(C)); C[0][0] = 1LL; C[1][0] = C[1][1] = 1LL; for(int i = 2; i <= 50; i++) { for(int j = 0; j <= i; j++) { if(j == 0) { C[i][j] = 1LL; } else { C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod; } } } scanf("%lld",&t); for(lint cas = 1; cas <= t; cas++) { scanf("%lld %lld", &n, &k); siz = k + 2; Matrix tran; memset(tran.a, 0, sizeof(tran.a)); for(int i = 1; i <= k + 1; i++) { for(int j = 1; j <= k + 1; j++) { if(i <= j) { tran.a[i][j] = C[k + 1 - i][j - i]; } } } for(int i = 1; i <= k + 1; i++) { tran.a[k + 2][i] = C[k][i - 1]; } tran.a[k + 2][k + 2] = 1LL; Matrix ans = quick_pow(tran, n - 1); lint answer = 0; for(int i = 1; i <= k + 2; i++) { answer = (answer + ans.a[k + 2][i]) % mod; } printf("Case %lld: %lld\n", cas, answer); } return 0;}
0 0
- Light OJ 1132 Summing up Powers 矩阵快速幂
- Light oj 1132 Summing up Powers (矩阵快速幂)
- Light oj 1132 - Summing up Powers
- light oj 1132 Summing up Powers
- 矩阵快速幂lightoj1132 - Summing up Powers
- LightOJ - 1132 Summing up Powers 矩阵快速幂
- LightOJ 1132 - Summing up Powers 矩阵快速幂+排列组合
- [矩阵快速幂] LightOJ 1132 - Summing up Powers
- Lightoj 1132 Summing up Powers(矩阵快速幂)
- [矩阵快速幂] LightOJ 1142 - Summing up Powers (II)
- LightOJ 1132 Summing up Powers(矩阵快速幂+二项式定理)
- LightOJ1132---Summing up Powers (矩阵快速幂+二项式定理(简单推理))
- LightOJ - 1132 Summing up Powers
- 【矩阵快速幂】LightOJ_1132_Summing up Powers
- Summing up Powers LightOJ
- LinghtOJ1132 Summing up Powers
- Summing up Powers LightOJ
- light oj 1132【矩阵快速幂】/【伯努利数】
- 【黑马程序员】Java基础学习技术博客——基本数据类型
- hdoj.2053 Switch Game 20140729
- lazy懒加载(延迟加载)UITableView
- Java中static、final用法小结
- 杭电ACM 素数判定
- Light OJ 1132 Summing up Powers 矩阵快速幂
- How Tomcat work 之第十五章之Digester
- hdoj.2055 An easy problem 20140729
- centos6.4 升级python27引发的一系列问题以及解决方案
- python 字符
- 分支-14. 简单计算器
- Oracle 11g 学习一:初始Orcale
- hdoj.2056 Rectangles 20140729
- 俺不是标题党,只想写下自己的一些体会。