【矩阵快速幂】之奥运 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 ... 
随机推荐
- JVM java内存区域的介绍
			jvm虚拟机在运行时需要用到的内存区域.广泛一点就是堆和栈,其实不然,堆和栈只是相对比较笼统的说法,真正区分有如下几个 先上图一: 总的就是 java的内存模型 内存模型又分堆内存(heap)和方法区 ... 
- vue模板语法下
			样式绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ... 
- FormData的介绍(一)
			FormData对象介绍FormData字母意思是表单数据,H5新增的一个内置对象.可以获取任何类型的表单数据,如text radio checkbox file textarea 常用语发送ajax ... 
- layUI学习第二日:非模块化方法使用layUI
			layUI采用非模块化方式(即所有模块一次性加载),操作示例代码如下(如果问怎么创建项目和工具,参考layUI学习第一日的步骤): 运行的结果如下: 运行的显示不会太持久,过几秒就会消失,具体封装的代 ... 
- 如何在本地开发Composer包
			如何在本地开发Compoer包 周煦辰 2019-05-26 记录一下如何在本地开发一个Composer包,以及如何发布到Packgist. 假设你要开发一个名叫xuchen/biubiubiu的包. ... 
- [03]使用 VS2019 创建 ASP.NET Core Web 程序
			使用 VS2019 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开 ... 
- EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
			增加模型精度的方法有增加网络的深度,特征图的通道数以及分辨率(如下图a-d所示).这篇文章研究了模型缩放,发现仔细平衡网络的深度.宽度和分辨率可以获得更好的性能(下图e).在此基础上,提出了一种新的缩 ... 
- js获取当前日期,包括星期几
			function getCurrentDate() { var myDate = new Date(); var year = myDate.getFullYear(); // ... 
- Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来
			计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一.Spring Ca ... 
- vscode 通过ftp发布vue到azure服务器
			参考资料:vs code配置ftp连接远程服务器实现代码文自动上传 1.在vscode应用商店中搜索拓展sftp插件,然后进行安装.2.安装完成后重启窗口,按快捷键Ctrl+shift+p,输入sft ... 
