题意:杰杰是魔法界的一名传奇人物。他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力。自从他从事魔法竞赛以来,短短几年时间,就已经成为世界公认的实力最强的魔法选手之一。更让人惊叹的是,他几乎没有借助外界力量,完全凭借自己的努力达到了普通人难以企及的高度。在最近的世界魔法奥林匹克竞赛上,他使用高超的魔法本领,一路过关斩将,在最后时刻一举击败了前冠军“旅行者”,获得了魔法界最高的荣耀:女神奖杯!女神奖杯可不是一个普通的奖杯,她能够帮杰杰实现一个愿望。
杰杰本着实事求是的态度,审时度势,向女神奖杯提出了自己的愿望:想要一个女性朋友。

杰杰的愿望实现了,可是女性朋友却和他不在一个城市。杰杰想要知道:如果要到达女性朋友的所在城市,有多少种方案供他选择?
杰杰所在的世界有n个城市,从1到n进行编号。任意两个城市都通过有向道路连接。每个城市u有k个入点权:$in[1],in[2]...in[k],有k个出点权:ou[1],ou[2]...ou[k]。对于任意两个城市(u,v)(u可以等于v),u到v的道路条数为(ou[1] \times in[v][1]+ou[2] \times in[v][2]+...+ou[k] \times in[v][k])条。杰杰有m次询问,每次询问由三元组(u,v,d)构成,询问从u城市通过不超过d条道路到达v$城市的方案数。
为了温柔的杰杰和他的女性朋友的美好未来,帮助他解答这个问题吧。

发现暴力矩阵快速幂一次就要n^3,但发现这个矩阵是由n*k和k*n两个矩阵相乘所得,更换中间乘的顺序快速幂里就变成k*k的矩阵,再乘上刚开始的n*k,最后一次不要全乘,就算要知道答案的那位即可。而因为要知道的是小于等于d步,新建一个点接受从v点来的答案及上一次答案即可。

#pragma GCC optimize(3,"inline","Ofast")
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=65,K=25;
const int mod=1e9+7;
int n,k,m,ot[N][K],in[K][N],tp[N][K];
struct Mat{int a[K][K];void init0(){memset(a,0,sizeof a);}void init1(){memset(a,0,sizeof a);for(int i=1;i<=k;i++)a[i][i]=1;}
};
Mat operator *(const Mat x,const Mat y)
{Mat res;res.init0();for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)for(int kk=1;kk<=k;kk++)res.a[i][j]=(1LL*x.a[i][kk]*y.a[kk][j]%mod+res.a[i][j])%mod;return res;
}
Mat qpow(Mat x,int y)
{Mat res;res.init1();while(y){if(y&1)res=res*x;x=x*x;y>>=1;}return res;
}
int main()
{Mat nw;int ans,u,v,d;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){for(int j=1;j<=k;j++)scanf("%d",&ot[i][j]);for(int j=1;j<=k;j++)scanf("%d",&in[j][i]); }++k,++n;scanf("%d",&m);while(m--){memset(tp,0,sizeof tp),ans=0;scanf("%d%d%d",&u,&v,&d);for(int i=1;i<=n;i++)ot[i][k]=(i==v||i==n)?1:0;in[k][n]=1;nw.init0();for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)for(int kk=1;kk<=n;kk++)nw.a[i][j]=(1LL*in[i][kk]*ot[kk][j]%mod+nw.a[i][j])%mod;nw=qpow(nw,d);for(int i=1;i<=n;i++)for(int j=1;j<=k;j++)for(int kk=1;kk<=k;kk++)tp[i][j]=(1LL*ot[i][kk]*nw.a[kk][j]%mod+tp[i][j])%mod;for(int kk=1;kk<=k;kk++)ans=(1LL*tp[u][kk]*in[kk][n]+ans)%mod;printf("%lld\n",ans);      }
}

刷题集--杰杰的女性朋友相关推荐

  1. 2020-07算法刷题集

    2020-07算法刷题集 前言 0715-一年中的第几天 0716-分数加减运算 0717-移动石子直到连续 0719-拼写单词 0720-有效的回旋镖 0722-最后一块石头的重量 0723-有效三 ...

  2. 可爱宝宝力扣刷题集目录

    总述 编程菜鸟一枚!2020年7月,我仍然还是一个几乎不会码代码的菜鸟,(好多小伙伴应该从本科入学就开始了吧.哎,捂脸并逃走),不过从今年4月底刷了有一个多月,狂刷了300多倒(截止2020.6,8) ...

  3. 洛谷OJ素数及其筛法刷题集

    学会了线性筛.快速判断素数的读者可以在OJ上刷这些题了(后续将会完善补充) P3912 素数个数 P1835 素数密度 本题稍有难度,可以结合合数的性质来快速筛除区间内的合数,时间复杂度大致接近于区间 ...

  4. DancingLinks刷题集

    HDU 3663 Power Stations 精确覆盖 题意:每个城市i有xi->yi天可以成为发射站,发射站覆盖范围为与该站有一条边链接的城市. 同时,每个每天城市必须且只能被一个发射站覆盖 ...

  5. PAT刷题集(乙级)1003 我要通过!(20 分)

    1003 我要通过!(20 分) "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件, ...

  6. leetcode刷题集:栈与队列

    文章目录 01 用两个栈模拟一个队列 02 包含min函数的栈 03 栈的压入.弹出序列 队列的最大值 01 用两个栈模拟一个队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appen ...

  7. 刷题集--郁闷的出纳员

    题意:OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如 ...

  8. 【Python入门刷题】——NP10 牛牛最好的朋友们

    文章目录

  9. 刷题集--GameZ游戏排名系统

    题意:GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时,先上传记录者优先 ...

最新文章

  1. 【风险管理】策略开发流程
  2. Redis 6.0 新特性,多线程连环 13 问!
  3. 【译】Activitys, Threads和 内存泄露
  4. 如何在endnote列表中显示research note
  5. how does UI Framework get url of detail page - _router
  6. 泰顺县人事劳动社会保障局灾备集成项目招标
  7. 带宽检测工具iftop
  8. java中abcd_java中请不要出现aBcd类似的变量名
  9. uandroidtool使用教程_apktool反编译详细使用教程_图文教程
  10. Redis开发与运维读书笔记
  11. 微信记录删了,怎么恢复找回来?5种攻略推荐
  12. 智慧运维平台之全息监控
  13. TypeScript基础 ts文件的创建与执行
  14. img 获取二次元图片地址
  15. 编写python程序、计算账户余额_《易学Python》——第1章 为何学习Python 1.1 学习编程...
  16. 休眠后网络无法自动连接——网卡属性没有电源管理选项
  17. 第五章 欧洲科技文明的起源
  18. 未来最吃香的五大互联网职业,你选对了吗?
  19. 四月总结归纳 Deeplearning and Pytoch
  20. Dynamic CRM Plugin

热门文章

  1. C#excel导入导出
  2. python中合法的标识符_python合法标识符要求是什么
  3. MC服务器工业2mod没有显示,我的世界工业2服务器bug | 手游网游页游攻略大全
  4. 拉普拉斯矩阵和拉普拉斯二次型
  5. C# 实现对PPT编辑
  6. c语言中god----指针
  7. thinkphp5 调用支付宝支付电脑版
  8. 【30篇突击 android】源码统计六
  9. Java项目之银行系统
  10. supervise进程监控工具