【矩阵快速幂】之奥运 hdu 2254
1、城市的编号不是从0到n-1,而是随便的一个数字,需要离散化否则不能存相关信息
2、城市数不超过30,也就是说我的方法开矩阵不超过60,但是我残念的一开始以为最多可能有20000个不同城市 血崩!
3、图中可能有重边,所以别用=1,要用++操作
4、询问中v1,v2可能在前面的城市编号集中没有出现,那么此时答案为0
5、t1可能比t2大,这种情况你就交换下t1,t2
好了接下来讲下解法:
由离散知识我们知道:
,矩阵A的n次方里面的(A^n)[i][j]表示从i到j且路径长度为n的不同路径条数。这一定理正好适用这一题目。我用邻接矩阵来建图(单向边,一条边对应一个++操作)得到矩阵A,题目要求的就是{A^(t1)}[v1][v2]+{A^(t1+1)}[v1][v2]+{A^(t1+2)}[v1][v2]+......+{A^(t2)}
然后就是矩阵乘法模板优化一下
#include<bits/stdc++.h>
using namespace std;
const int mod=2008;
int n,sum;
struct node
{
int a[35][35];
}mt,MT[20005];
int num[20005];
struct st
{
int l,r;
}f[20005];
//node mat(node x,node y)
//{
// node c;
// for(int i=0;i<n;i++)
// for(int j=0;j<n;j++)
// c.a[i][j]=0;
// for(int i=0;i<n;i++)
// for(int j=0;j<n;j++)
// for(int k=0;k<n;k++)
// {
// c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j]);
// if(c.a[i][j]>=2008)
// c.a[i][j]%=2008;
// }
// return c;
//}
struct node mat(node cur,node now)
{
node ww;
memset(ww.a,0,sizeof(ww.a));
int i,j,k;
for(i=1;i<=n;i++)
for(k=1;k<=n;k++)
if(cur.a[i][k])
{
for(j=1;j<=n;j++)
if(now.a[k][j])
{
ww.a[i][j]=ww.a[i][j]+(cur.a[i][k]*now.a[k][j])%2008;
if(ww.a[i][j]>=2008)
ww.a[i][j]%=2008;
}
}
return ww;
}
//int EF(int numb)
//{
// int l=1;
// int r=sum;
// int ans=0;
// while(l<=r){
// int mid=(l+r)/2;
// if(num[mid]>numb) r=mid-1;
// else
// l=mid+1,ans=mid;
// }
// return ans;
//}
int EF(int numm)//二分查找
{
int l=1;
int r=sum;
int mid=(l+r)/2;
while(l<r)
{
if(num[mid]>numm)
r=mid-1;
else if(num[mid]<numm)
l=mid+1;
else return mid;
mid=(l+r)/2;
}
return mid;
}
void solve()
{
int m,v1,v2,t1,t2,ans;
scanf("%d",&m);
while(m--){
ans=0;
scanf("%d%d%d%d",&v1,&v2,&t1,&t2);
if(t1>t2) swap(t1,t2);
int l=EF(v1);
int r=EF(v2);
if(v1!=num[l]||v2!=num[r]){
puts("0");
continue;
}
for(int i=t1;i<=t2;i++){
ans=(ans+MT[i].a[l][r]);
if(ans>=2008)
ans%=mod;
}
printf("%d\n",ans);
}
}
int main()
{
int len;
while(scanf("%d",&n)>0){
len=0;
for(int i=1;i<=n;i++){
scanf("%d %d",&f[i].l,&f[i].r);
num[++len]=f[i].l;
num[++len]=f[i].r;
}
memset(mt.a,0,sizeof(mt.a));
sort(num+1,num+len+1);
sum=unique(num+1,num+1+len)-(num+1);
for(int i=1;i<=n;i++){
int l=EF(f[i].l);
int r=EF(f[i].r);
// printf("%d %d\n",l,r);
mt.a[l][r]++;
}
MT[1]=mt;
for(int i=2;i<=10000;i++){
MT[i]=mat(mt,MT[i-1]);
}
solve();
}
return 0;
}
【矩阵快速幂】之奥运 hdu 2254的更多相关文章
- 一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483
思想启发来自, 罗博士的根据递推公式构造系数矩阵用于快速幂 对于矩阵乘法和矩阵快速幂就不多重复了,网上很多博客都有讲解.主要来学习一下系数矩阵的构造 一开始,最一般的矩阵快速幂,要斐波那契数列Fn=F ...
- 矩阵快速幂AC代码HDU 2035
#include <iostream> using namespace std;const int MOD = 1000;//像这样的一个常量就应该专门定义一下 int PowMod(in ...
- HDU 2855 斐波那契+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ...
- HDU 2855 (矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- HDU 5950:Recursive sequence(矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- HDU 1757 A Simple Math Problem(矩阵快速幂)
题目链接 题意 :给你m和k, 让你求f(k)%m.如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… ...
- hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...
随机推荐
- 微信小程序支付功能讲解(2)
小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...
- web系统测试策略
1.按系统架构可分为: 客户端测试.服务器端测试.网络上测试 2.按职能可分为: 应用功能的测试.web应用服务的测试.安全系统的测试.数据库服务的测试 3.按软件质量特性: (1)功能测试 链接测试 ...
- BZOJ1391/LG4177 「CEOI2008」order 最大权闭合子图
问题描述 BZOJ1391 LG4177 题解 最大权闭合子图,本质是最小割 在任务和机器中间的边之前权值设为INF,代表不可违背这条规则 本题的租借就相当于允许付出一定代价,违背某个规则,只需要把中 ...
- C语言验证哥德巴赫猜想
#include<stdio.h>int f(int x);int main(void){ int n,i; scanf("%d",&n); for( ...
- 【python爬虫】正则表达式
一.数据的分类 1.结构化数据 特点:数据以行为单位,每一个数据表示一个实体.每一行数据的属性都是一样的. 举例:关系型数据库中的表就是结构化数据. 处理方法:sql 2.半结构化数据 特点:结构化数 ...
- java启动参数
java命令启动应用所使用的参数,基本是用于JVM的,某种程度上也叫做JVM参数.总的来说,java启动参数共分为三大类,分别是: 标准参数(-):相对稳定的参数,每个版本的JVM都可用. 非标准X参 ...
- IT兄弟连 Java语法教程 数据类型1
Java是强类型化的语言 Java是一种强类型话的语言,在开始时指出这一点是很重要的.实际上,Java的安全性和健壮性正是部分来自这一事实.强类型意味着什么呢?首先,每个变量都具有一种类型,每个表达式 ...
- 14-认识DjangoRESTframework
了解DjangoRESTframework 现在流行的前后端分离Web应用模式,然而在开发Web应用中,有两种应用模式:1.前后端不分离 2.前后端分离. 1.前后端不分离 在前后端不分离中,前端看见 ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- C# 结构与类
结构是一种可以包含数据成员和方法成员的值类型数据结构.为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据.结构中可以包含构造函数,常量,字段方法,属性,运算符,事件和嵌套类 ...