http://acm.hdu.edu.cn/showproblem.php?pid=2254

矩阵乘法两个经典问题的综合题,还要离散化和处理边界,好题啊好题

题意容易理解错,每一天是独立的,所以根据加法原理方案数是G^1+G^2+...+G^t

/*
此题要求 (G^1+G^2+...+G^t2)-(G^1+G^2+...+G^(t1-1))
求和的方法是再次二分,k=6时
G + G^2 + G^3 + G^4 + G^5 + G^6 = G + G^2 + G^3 + G^3 * (G + G^2 + G^3) = (1 + G^3) * (G + G^2 + G^3)
这样计算可以使k的规模减少一半,快速幂求出G^3后可递归计算G+G^2+G^3,即得答案
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map> using namespace std; #define MOD 2008 #define Mat 35 //矩阵大小 struct mat{//矩阵结构体,a表示内容,r行c列 矩阵从1开始
int a[Mat][Mat];
int r, c;
mat() {
r = c = ;
memset(a, , sizeof(a));
}
}; void print(mat m) {
//printf("%d\n", m.size);
for(int i = ; i < m.r; i++) {
for(int j = ; j < m.c; j++) printf("%d ", m.a[i][j]);
putchar('\n');
}
} mat mul(mat m1, mat m2, int mod) {
mat ans = mat();
ans.r = m1.r, ans.c = m2.c;
for(int i = ; i <= m1.r; i++)
for(int j = ; j <= m2.r; j++)
if(m1.a[i][j])
for(int k = ; k <= m2.c; k++)
ans.a[i][k] = (ans.a[i][k] + m1.a[i][j] * m2.a[j][k]) % mod;
return ans;
} mat add(mat m1, mat m2, int mod) {
mat ans = mat();
ans.r = ans.c = m1.r;
for(int i = ; i <= m1.r; i++)
for(int j = ; j <= m1.r; j++)
ans.a[i][j] = (m1.a[i][j] + m2.a[i][j]) % mod;
return ans;
} mat quickmul(mat m, int n, int mod) {
mat ans = mat();
for(int i = ; i <= m.r; i++) ans.a[i][i] = ;
ans.r = m.r, ans.c = m.c;
while(n) {
if(n & ) ans = mul(m, ans, mod);
m = mul(m, m, mod);
n >>= ;
}
return ans;
} mat A; mat sum(mat m, int n, int mod) { //m^1+m^2+...+m^n
if(n == ) return m;
if(n & ) return add(quickmul(m, n, mod), sum(m, n-, mod), mod); //是否加m^n
else return mul(add(quickmul(m, n>>, mod), A, mod), sum(m, n>>, mod), mod); // (1 + m^(n/2)) * (m + m^2 +...+ m^(n/2))
} /*
初始化ans矩阵
mat ans = mat();
ans.r = R, ans.c = C;
ans = quickmul(ans, n, mod);
*/ int main() {
A = mat();
for(int i = ; i <= ; i++) A.a[i][i] = ;
int n;
while(~scanf("%d", &n)) {
mat G = mat();
G.r = G.c = ;
map <int, int> mp;
int rank = ;
while(n--) {
int a, b;
scanf("%d%d", &a, &b);
if(!mp[a]) mp[a] = rank++;
if(!mp[b]) mp[b] = rank++;
G.a[mp[a]][mp[b]]++;
}
int k;
scanf("%d", &k);
for(int i = ; i < k; i++) {
int v1, v2, t1, t2;
scanf("%d%d%d%d", &v1, &v2, &t1, &t2);
v1 = mp[v1];
v2 = mp[v2];
if(t1 > t2) swap(t1, t2);
if(!t1){
if(!t2) puts("");
else {
int ans = sum(G, t2, MOD).a[v1][v2];
printf("%d\n", ans);
}
}
else if(t1 == ) {
int ans = sum(G, t2, MOD).a[v1][v2];
printf("%d\n", ans);
}
else {
int ans1 = sum(G, t1-, MOD).a[v1][v2];
int ans2 = sum(G, t2, MOD).a[v1][v2];
printf("%d\n", (ans2 - ans1 + MOD) % MOD);
}
}
}
return ;
}

HDU 2254的更多相关文章

  1. hdu 2254 奥运

    点击打开hdu 2254 思路: 矩阵乘法 分析: 1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数 2 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即 ...

  2. HDU 2254 奥运(矩阵高速幂+二分等比序列求和)

    HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意:  中问题不解释. 分析:  依据floyd的算法,矩阵的k次方表示这个矩阵走了k步.  所以k ...

  3. hdu 2254 奥运(邻接矩阵应用)

    Problem Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强 ...

  4. HDU 2254 奥运(数论+矩阵)

    题目中文的不解释啊. .. 须要注意的就是:离散数学中,有向图的邻接矩阵A表示全部点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量.故须要求某两点在(A^t1)~(A^t2)的路径数量 ...

  5. hdu 2254(矩阵)

    题意:指定v1,v2,要求计算出在t1,t2天内从v1->v2的走法 思路:可以知道由矩阵求,即将其建图A,求矩阵A^t1 + ...... + A^t2.   A^n后,/*A.xmap[v1 ...

  6. HDU 2254 奥运(矩阵+二分等比求和)

    奥运 [题目链接]奥运 [题目类型]矩阵+二分等比求和 &题解: 首先离散化城市,之后就是矩阵快速幂了,但让求的是A^(t1)+A^(t1+1)+...+A^(t2),我先想的是打表,但时间真 ...

  7. HDU - 2254 奥运 (求等比数列和)

    Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的 ...

  8. 【矩阵快速幂】之奥运 hdu 2254

    1.城市的编号不是从0到n-1,而是随便的一个数字,需要离散化否则不能存相关信息 2.城市数不超过30,也就是说我的方法开矩阵不超过60,但是我残念的一开始以为最多可能有20000个不同城市    血 ...

  9. HDU 5643 King's Game 打表

    King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...

随机推荐

  1. Git 忽略文件

    在Git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a    ...

  2. Aggregation 聚集

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 使用IE11抓包,防止在网页跳转时抓包数据被清除的方法

    引:最近在研究使用python实现模拟登陆各大网站,在使用IE11进行抓包分析网站登陆的逻辑结构的时候,发现每次在抓包的时候,当网页跳转的时候,抓包数据会被清除,让我很是郁闷,最终在查阅相关资料以及自 ...

  4. centos7上consul的集群安装

    centos7上consul的安装 ###一 下载 下载文件 wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_a ...

  5. 深入浅出设计模式——桥接模式(Bridge Pattern)

    模式动机设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状都提供一套 ...

  6. EditText设置文字改变时的监听

    textWatcher = new TextChangeWatcher(); etQuerryInfo.addTextChangedListener(textWatcher); /** * 文字改变类 ...

  7. 0050 Linux VIM 命令

    1.  模式切换 vim的模式 $ vi filename 进入normal 模式,这是命令模式,用于执行大多数常用的编辑命令,不能输入 敲i 进入 insert 模式,这是正常的编辑模式,按Esc ...

  8. News common vocabulary

    英语新闻常用词汇与短语 经济篇 accumulated deficit 累计赤字 active trade balance 贸易顺差 adverse trade balance 贸易逆差 aid 援助 ...

  9. Redis + php扩展的安装与配置(windows)

    -->安装Redis服务 下载redis安装包 http://pan.baidu.com/s/1pJiVFHx 下载后解压 把解压后文件夹里面的文件(根据自己的系统位数选择32位或者64位)拷贝 ...

  10. NGINX 内存池有感

    写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...