Description

北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up!

比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的感动了。反正我的钱也多的没地方放了,他对自己说,我自己也来举办一个奥运会。看谁的更火。只是他的奥运会非常特别:


1 參加人员必须是中国人;

2 至少会加法运算(由于要计算本人获得的金牌数)

他知道中国有非常多的名胜古迹,他知道自己在t1 到 t2天内不可能把全部的地方都玩遍,所以他决定指定两个地方v1,v2。假设參赛员能计算出在t1到t2天(包含t1,t2)内从v1到v2共同拥有多少种走法(每条道路走须要花一天的时间,且不能在某个城市停留,且t1=0时的走法数为0),那么他就会获得对应数量的金牌,城市的总数<=30,两个城市间能够有多条道路


,每条都视为是不同的。
 

Input

本题多个case,每一个case:

输入一个数字n表示有n条道路 0<n<10000

接下来n行每行读入两个数字 p1,p2 表示城市p1到p2有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32)

输入一个数字k表示有k个參赛人员

接下来k行,每行读入四个数据v1,v2,t1,t2 (0<=t1,t2<10000)
 

Output

对于每组数据中的每一个參赛人员输出一个整数表示他获得的金牌数(mod 2008)
 

Sample Input

6
1 2
1 3
2 3
3 2
3 1
2 1
3
1 2 0 0
1 2 1 100
4 8 3 50
 

Sample Output

0
1506
0

思路:矩阵的基本应用之中的一个:我们都知道s[a][b]能够代表一步从a到b的路径数,那么矩阵的n次方就代表走n步的路径数。又偷了个模板

#include <map>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=35;
const int mod=2008; class Matrix {
public:
int a[maxn][maxn];
int n; void init(int x) {
memset(a,0,sizeof(a));
if (x)
for (int i = 0; i < maxn ; i++)
a[i][i] = 1;
} Matrix operator +(Matrix b) {
Matrix c;
c.n = n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
c.a[i][j] = (a[i][j] + b.a[i][j]) % mod;
return c;
} Matrix operator +(int x) {
Matrix c = *this;
for (int i = 0; i < n; i++)
c.a[i][i] += x;
return c;
} Matrix operator *(Matrix b)
{
Matrix p;
p.n = b.n;
p.init(0);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
p.a[i][j] = (p.a[i][j] + (a[i][k]*b.a[k][j])%mod) % mod;
return p;
} Matrix power(int t) {
Matrix ans,p = *this;
ans.n = p.n;
ans.init(1);
while (t) {
if (t & 1)
ans=ans*p;
p = p*p;
t >>= 1;
}
return ans;
}
}a;
map<int,int> mp; //分治求(a^1+a^2+...+.a^n)%mod
Matrix Cal(Matrix a,int n) {
if (n == 1)
return a;
if (n & 1)
return a.power(n) + Cal(a, n-1);
else
return Cal(a, n/2) * (a.power(n/2) + 1);
} int main() {
int n,m;
while (scanf("%d",&n) != EOF) {
a.init (0);
mp.clear();
int id = 0, u, v, t1, t2;
for (int i = 0; i < n; i++) {
scanf("%d%d",&u,&v);
if (mp.find(u) == mp.end())
mp[u]=id++;
if (mp.find(v) == mp.end())
mp[v]=id++;
a.a[mp[u]][mp[v]]++;
}
a.n = id;
scanf("%d",&m);
while (m--) {
scanf("%d%d%d%d",&u,&v,&t1,&t2);
if (mp.find(u)==mp.end() || mp.find(v)==mp.end()) {
printf("0\n");
continue;
}
if (t1 > t2)
swap(t1,t2);
int s = mp[u],t = mp[v];
if (t1 == 0) {
if (t2 == 0)
printf("0\n");
else
printf("%d\n",Cal(a,t2).a[s][t]);
}
else if (t1 == 1) {
printf("%d\n",Cal(a,t2).a[s][t]);
}
else {
int ans = Cal(a,t2).a[s][t]-Cal(a,t1-1).a[s][t];
ans = (ans%mod + mod)%mod;
printf("%d\n",ans);
}
}
}
return 0;
}

HDU - 2254 奥运 (求等比数列和)的更多相关文章

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

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

  2. hdu 2254 奥运

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

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

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

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

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

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

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

  6. C++求等比数列之和

    题目内容:已知q与n,求等比数列之和:1+q+q2+q3+q4+……+qn. 输入描述:输入数据不多于50对,每对数据含有一个整数n(1<=n<=20).一个小数q(0<q<2 ...

  7. hdu 5111 树上求交

    hdu 5111 树上求交(树链剖分 + 主席树) 题意: 给出两棵树,大小分别为\(n1\),\(n2\), 树上的结点权值为\(weight_i\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...

  8. poj1845(二分快速求等比数列模M和)

    Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17039   Accepted: 4280 Descripti ...

  9. HDU - 1588 Gauss Fibonacci (矩阵高速幂+二分求等比数列和)

    Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very cle ...

随机推荐

  1. hdu_5139 概率问题

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main( ...

  2. settings.xml配置的镜像

    <localRepository>D:/apache-maven-3.5.4/maven-jar/repository</localRepository> <mirror ...

  3. linux驱动编译时候出现的问题

    1.在编译驱动的时候,提示错误,找不到<asm/xxxx.h>这些类的头文件? 答:因为在内核编译的时候,会在内核目录的include中创建一个asm文件再软链接到对应的一些架构.比如我当 ...

  4. 京东在2018年成为Intel全球最大PC零售渠道

    京东宣布,根据Intel公布的数据,京东在2018年成为Intel全球最大的PC零售渠道. 近日,京东.Intel高层进行了战略会晤,在总结回顾2018年合作成果的同时,就2019年进一步深度战略合作 ...

  5. python Web抓取(一)[没写完]

    需要的模块: python web抓取通过: webbrowser:是python自带的,打开浏览器获取指定页面 requests:从因特网上下载文件和网页 Beautiful Soup:解析HTML ...

  6. 【转】C#中RSA加密解密和签名与验证的实现

    [转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...

  7. HTML学习----------DAY2第六节

    在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1> 定义最大的标题.<h6 ...

  8. 怎样安装Windows7操作系统

     1. 打开电脑,插入Windows7安装光盘. 2. 又一次启动电脑: 3. 依据提示按下对应的键.进入选择启动项菜单选择光驱引导.在"Boot Menu"界面按键盘上下键选 ...

  9. ControlDesigner

    GetHitTest https://stackoverflow.com/questions/7762397/how-do-i-click-a-usercontrols-child-in-design ...

  10. js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用

    js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用 一.总结 一句话总结:图片懒加载echo.js结合 Amaze UI ScrollSpy 使用的效果就是:懒加载 ...