HDU 2254 奥运(矩阵高速幂+二分等比序列求和)
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 matrix
const 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;
}
HDU 2254 奥运(矩阵高速幂+二分等比序列求和)的更多相关文章
- HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出 ...
- ZOJ 3690 & HDU 3658 (矩阵高速幂+公式递推)
ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...
- HDU 2254 奥运(矩阵+二分等比求和)
奥运 [题目链接]奥运 [题目类型]矩阵+二分等比求和 &题解: 首先离散化城市,之后就是矩阵快速幂了,但让求的是A^(t1)+A^(t1+1)+...+A^(t2),我先想的是打表,但时间真 ...
- HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)
Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...
- HDU 2604 Queuing 矩阵高速幂
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 1575 Tr A(矩阵高速幂)
题目地址:HDU 1575 矩阵高速幂裸题. 初学矩阵高速幂.曾经学过高速幂.今天一看矩阵高速幂,原来其原理是一样的,这就好办多了.都是利用二分的思想不断的乘.仅仅只是把数字变成了矩阵而已. 代码例如 ...
- hdu 5318 The Goddess Of The Moon 矩阵高速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS ( ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)
题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路: 设A = |(1, 1),(1, 0) ...
随机推荐
- SQL中inner join,outer join和cross join的区别
使用join连表,缺陷的情况下是inner join,开发中使用的left join和right join属于outer join,outer join还包括full join 现有两张表,Table ...
- 教你如何搭建vue项目
笔者工作也有一些时间,需要用vue写项目时也总是项目组长已经把项目搭建好了, 偶尔心血来潮想试着自己搭建一个vue项目 我们搭建vue项目呢主要是用到了vue-cli来搭建,但是前提是必须要已经安装好 ...
- CentOS7 Failed to start LSB: Bring up/down networking. 已解决!!!
服务器更换了主板之前配置的静态IP发现启动网卡出现异常. 执行 service network restart 出现以下错误 Restarting network (via systemctl): ...
- MPlayer源代码分析
http://blog.csdn.net/leixiaohua1020/article/details/11885509 一.Mplayer支持的格式 MPlayer是一个LINUX下的视频播放器,它 ...
- python __slot__
class Player(object): def __init__(self,name,age,life): self.name=name self.age=age self.life=life c ...
- hdu 4021 24 Puzzle ( 逆序数判断是否可解 )
24 Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total ...
- 遍历JavaScript某个对象所有的属性名称和值
/* * 用来遍历指定对象所有的属性名称和值 * obj 需要遍历的对象 */ function allPrpos(obj) { // 用来保存所有的属性名称和值 var props = " ...
- Python 二维码解码
二维码解析 Python中关于二维码解析的现成模块有很多,比较著名的就是Zbar以及ZXing.然而很不幸的是,官方的版本都是支持到python2.x,下面是在python2.x的例子: import ...
- 微信小程序小红点未读消息如何实现?
如图类似的 这样的需求还挺多的,那么如何实现呢? data: { userInfo: {}, projectSource: 'https://github.com/liuxuanqiang/wec ...
- windows磁盘API实践
API的列表如下,网上找的,我觉得还是蛮详细的: 磁盘和驱动器管理APIGetLogicalDrivers 获取主机中所有的逻辑驱动器,以BitMap的形式返回.GetLogicalDri ...