HDU 2254 奥运(矩阵快速幂+二分等比序列求和)
来源:互联网 发布:网络专科学位证有用吗 编辑:程序博客网 时间:2024/06/11 21:22
HDU 2254 奥运(矩阵快速幂+二分等比序列求和)
ACM
题目地址:HDU 2254 奥运
题意:
中问题不解释。
分析:
根据floyd的算法,矩阵的k次方表示这个矩阵走了k步。
所以k天后就算矩阵的k次方。
这样就变成:初始矩阵的^[t1,t2]这个区间内的v[v1][v2]的和。
所以就是二分等比序列求和上场的时候了。
跟HDU 1588 Gauss Fibonacci的算法一样。
代码:
/** Author: illuz <iilluzen[at]gmail.com>* Blog: http://blog.csdn.net/hcbbt* File: 2254.cpp* Create Date: 2014-08-04 10:52:29* Descripton: matrix, floyd*/#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <algorithm>using namespace std;#define repf(i,a,b) for(int i=(a);i<=(b);i++)typedef long long ll;const int N = 20;const int SIZE = 32; // max size of the matrixconst int MOD = 2008;int n, k, p1, p2;ll v1, v2, t1, t2;map<int, int> mp;struct Mat{ int n; ll v[SIZE][SIZE]; // value of matrix Mat(int _n = SIZE) { n = _n; } void init(ll _v = 0) { memset(v, 0, sizeof(v)); if (_v) repf (i, 0, n - 1) v[i][i] = _v; } void output() { repf (i, 0, n - 1) { repf (j, 0, n - 1) printf("%lld ", v[i][j]); puts(""); } puts(""); }} a, b;Mat operator * (Mat a, Mat b) { Mat c(a.n); repf (i, 0, a.n - 1) { repf (j, 0, a.n - 1) { c.v[i][j] = 0; repf (k, 0, a.n - 1) { c.v[i][j] += (a.v[i][k] * b.v[k][j]) % MOD; c.v[i][j] %= MOD; } } } return c;}Mat operator ^ (Mat a, ll k) { Mat c(a.n); c.init(1); while (k) { if (k&1) c = a * c; a = a * a; k >>= 1; } return c;}Mat operator + (Mat a, Mat b) { Mat c(a.n); repf (i, 0, a.n - 1) repf (j, 0, a.n - 1) c.v[i][j] = (b.v[i][j] + a.v[i][j]) % MOD; return c;}Mat operator + (Mat a, ll b) { Mat c = a; repf (i, 0, a.n - 1) c.v[i][i] = (a.v[i][i] + b) % MOD; return c;}Mat calc(Mat a, int n) { if (n == 1) return a; if (n&1) return (a^n) + calc(a, n - 1); else return calc(a, n/2) * ((a^(n/2)) + 1);}int main() { while (~scanf("%d", &n)) { a.init(); mp.clear(); int cnt = 0; while (n--) { scanf("%d%d", &p1, &p2); if (mp.find(p1) == mp.end()) p1 = mp[p1] = cnt++; else p1 = mp[p1]; if (mp.find(p2) == mp.end()) p2 = mp[p2] = cnt++; else p2 = mp[p2]; a.v[p1][p2]++; } a.n = cnt; scanf("%d", &k); while (k--) { scanf("%lld%lld%lld%lld", &v1, &v2, &t1, &t2); if (mp.find(v1) == mp.end() || mp.find(v2) == mp.end()) { puts("0"); continue; } v1 = mp[v1]; v2 = mp[v2]; if (t1 > t2) swap(t1, t2); if (t1 == 0) { if (t2 == 0) puts("0"); else printf("%lld\n", calc(a, t2).v[v1][v2]); } else if (t1 == 1) printf("%lld\n", calc(a, t2).v[v1][v2]); else { printf("%lld\n", ((calc(a, t2).v[v1][v2] - calc(a, t1 - 1).v[v1][v2]) + MOD) % MOD); } } } return 0;}
0 0
- HDU 2254 奥运(矩阵快速幂+二分等比序列求和)
- HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)
- hdu 2254 奥运(矩阵降幂+二分求和)
- hdu 2254 奥运(矩阵快速幂)
- [HDU 5411] CRB and Puzzle (矩阵加速DP + 前缀和矩阵|等比求和快速幂 )
- poj3233 等比矩阵二分求和
- POJ 3233 Matrix Power Series (矩阵乘法+快速幂+等比二分求和) -
- hdu 奥运(矩阵快速幂+等比数列快速求和+数论)
- POJ - 3233 Matrix Power Series (矩阵等比二分求和)
- HDU 1588 Gauss Fibonacci 斐波那契矩阵+等比矩阵二分求和
- hdu1588 Gauss Fibonacci(矩阵快速幂+二分求矩阵等比和)
- HDU1588 Gauss Fibonacci (矩阵快速幂+等比数列二分求和)
- poj 3233 矩阵快速幂 + 二分求和
- 快速矩阵幂+二分等比数列求和
- HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂+等比矩阵求和)
- 【矩阵快速幂】 HDU 5411 CRB and Puzzle 等比
- Hdu 2254 奥运 (矩阵)
- HDU 2254 奥运(矩阵)
- 如何快速构建基于Spring4.0的Rest API
- hiho一下 第四周 Hihocoder #1036 : Trie图
- HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂)
- Cocos2d-x中Lua脚本的加密
- Ubuntu中ckhconfig不能用了,解决办法
- HDU 2254 奥运(矩阵快速幂+二分等比序列求和)
- ganymed-ssh2实现java ssh协议采集
- 使用ganymed ssh2实现scp以及ssh内容访问
- 求条形图中最大矩形的面积的两种算法
- Spring MVC和Struts2的比较的优点
- 猜想 QQ好友分组 (微信好友)多层次分组策略 QQ好友过多
- HDU 1166 敌兵布阵(线段树入门,单点更新)
- [笔记]javascript面向对象 - 继承的几种模式
- HDU 1686 Lazy Math Instructor(中缀转后缀,栈模拟)