奥运

【题目链接】奥运

【题目类型】矩阵+二分等比求和

&题解:

首先离散化城市,之后就是矩阵快速幂了,但让求的是A(t1)+A(t1+1)+...+A^(t2),我先想的是打表,但时间真的太慢了,之后网上查的二分等比求和,这样logn就可以求等比矩阵的前n项和了

还有用二分等比求和时,矩阵最好用数组表示,尽量不用vector,我试了好几发,总是T,当然也有可能是我写的low了吧 - -

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N= 30 +9; struct Matrix
{
int m[N][N];
};
Matrix I,ZZ;
int n,m,M=2008; Matrix add(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c.m[i][j]=(a.m[i][j]+b.m[i][j])%M;
return c;
} Matrix multi(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c.m[i][j]=0;
for(int k=0;k<n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
}
}
return c;
}
Matrix power(Matrix A,ll n)
{
Matrix ans=I;
while(n){
if(n&1)
ans=multi(ans,A);
A=multi(A,A);
n>>=1;
}
return ans;
} Matrix sum(Matrix A,ll k)
{
if(k<=0) return ZZ;
if(k==1) return A;
// cout<<"k="<<k<<endl;
Matrix t=sum(A,k/2);
Matrix cur=power(A,k/2+(k&1));
t=add(t,multi(t,cur));
if(k&1) t=add(t,cur);
return t;
}
int v1,v2,t1,t2;
map<int,int> tb;
int main()
{
freopen("E:1.txt","r",stdin);
while(cin>>n){
Matrix gra;
//一定记得要初始化啊 矩阵I ZZ 和gra
tb.clear();
for(int i=0;i<35;i++){
I.m[i][i]=1;
for(int j=0;j<35;j++){
ZZ.m[i][j]=0;
gra.m[i][j]=0;
}
}
int ct=0;
for(int i=0;i<n;i++){
int u,v;
cin>>u>>v;
if(tb[u]==0)
tb[u]=++ct;
if(tb[v]==0)
tb[v]=++ct;
gra.m[tb[u]-1][tb[v]-1]++;
gra.m[tb[u]-1][tb[v]-1]%=M;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>v1>>v2>>t1>>t2; if(!tb[v1]||!tb[v2]){
puts("0");
}
else{
Matrix an1=sum(gra,t2);
Matrix an2=sum(gra,t1-1);
//这块 处理的时候减1了 输入地图的时候也要减1啊
cout<<((an1.m[tb[v1]-1][tb[v2]-1]-an2.m[tb[v1]-1][tb[v2]-1])%M+M)%M<<endl;
}
}
}
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 奥运(数论+矩阵)

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

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

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

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

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

  6. hdu 2254(矩阵)

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

  7. POJ 3233 Matrix Power Series(二分等比求和)

    Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...

  8. UVA-10689 Yet another Number Sequence (矩阵二分幂模板)

    题目大意:已知递推公式和边缘值,求某项的最后m(0<m<5)位数字. 题目分析:矩阵二分幂的模板题. 代码如下: # include<iostream> # include&l ...

  9. HDU.2640 Queuing (矩阵快速幂)

    HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...

随机推荐

  1. xcode工程编译错误:The maximum number of apps for free development profiles has been reached.

    真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...

  2. CABasicAnimation 划线动画

    CGFloat animateDuration = ; UIBezierPath *bezierPath = [[UIBezierPath alloc] init]; CGPoint centerFr ...

  3. Java之旅_面向对象_封装

    参考并摘自:http://www.runoob.com/java/java-encapsulation.html 在面向对象的程序设计方法中,封装(英语 :Encapsulation)是指一种将函数接 ...

  4. HashMap如何做循环遍历

    1.TestCase:

  5. 按键控制led驱动

    内核版本:linux2.6.22.6 硬件平台:JZ2440 驱动源码 key_drv.c : #include<linux/module.h> #include<linux/ker ...

  6. 怎么使用JavaScript进行进制转换

    JS 是一个很神奇的语言,内制的的很多函数可以帮我们进行数(进)制转换: JS中可以直接使用16进制: var a = 0xff; //255 将任意进制字符串转换为十进制,如二进制,八进制,十六进制 ...

  7. SpringBoot-热部署Devtools

    热部署 什么是热部署 所谓的热部署:比如项目的热部署,就是在应用程序在不停止的情况下,实现新的部署 项目演示案例 @RestController @Slf4j public class IndexCo ...

  8. c语言指针应用

    指针变量指向数组元素: #import <stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p; p=a; for ( ...

  9. Python日期与字符串互转

    import datetime #str -> date detester = '2017-01-01' date = datetime.datetime.strptime(detester,' ...

  10. 并发编程---开启进程方式---查看进程pid

    1.开启进程的两种方式 方式一: from multiprocessing import Process import time def task(name): print('%s is runnin ...