叶落归根(hometown)

题目描述

叶落归根——树叶从树根生发出来,凋落后最终还是回到树根。比喻事物总有一定的归宿。接下来是题目。

给定一个n个点的有向图G(点的编号为1~n),一开始落叶(仅作为一个代号,你也可以当成是Alice、Bob、甲乙丙丁戊己庚辛壬癸…)会在G的某个点s上。总共有t个单位时间,每个单位时间落叶都必须通过一条当前所在点的出边到达下一个点(有时下一个点和当前点会是相同的)。

需要注意的是,如果当前所在点没有任何出边,落叶就会在这个单位时间被迫离开这张图,并且我们认为落叶永远不会再回来了。

你要做的是对于每一个起始点s以及每一个总时长t(1<=t<=Q且为整数)求出落叶在起始点为s且经过t单位时间后的位置也是s的方案数。

两个方案不同,当且仅当两个方案中存在至少一个时刻落叶所经过的边不是图G中的同一条边。

为了便于检验,只需要输出所有情况(即所有不同的起始点和总时长,一共n*Q种情况)的方案数对给定正整数P取模后的异或和即可——也就是说,假设所有情况的方案数分别是ans1、ans2、ans3……你要输出的就是(ans1 mod P) xor (ans2 mod P) xor (ans3 mod P)……

输入

第一行3个整数n、Q、P,分别表示图G的点数、总时长t的上限和给定的模数P

接下来n行,每行n个整数,其中第i行第j个数表示图G中从i出发到j的单向边数目

输出

一行一个整数,表示所有情况的方案数对给定正整数P取模后的异或和

样例输入

2 2 1000000207
2 3
4 5

样例输出

50

提示

数据规模和约定

对于前10%的数据:n=2,Q=20

对于另外10%的数据:n=3,Q=12

对于前50%的数据:n<=20

对于100%的数据:1<=n<=100,P<=2^30,Q<=10000,对于任意一对(u,v),图G中从u到v的边数不超过2^30

来源


solution

就是一个矩阵,问你1-Q次方的对角线的和。

考虑枚举t(1<=t<=Q)

n^3乘出显然不行了。

那么可以分块。考虑令o=sqrt(n)

预处理矩阵的1~o次方 和x*o 次方(1<=x<=o)

那么每次相当于求对角线。n^2乘起来就行。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define maxn 10005
using namespace std;
int n,q,mod,o;
ll ans,A[][][],B[][][];
ll read(){
int v=;char ch;
while(!isdigit(ch=getchar()));v=(v<<)+(v<<)+ch-;
while(isdigit(ch=getchar()))v=(v<<)+(v<<)+ch-;
return v;
}
int main(){
cin>>n>>q>>mod;o=sqrt(q);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)A[][i][j]=read();
for(int x=;x<=o;x++){
for(int i=;i<=n;i++)
for(int k=;k<=n;k++)
for(int j=;j<=n;j++){
A[x][i][j]=(A[x][i][j]+A[x-][i][k]*A[][k][j])%mod;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
B[][i][j]=A[o][i][j];
}
int T=q/o+;
for(int x=;x<=T;x++){
for(int i=;i<=n;i++)
for(int k=;k<=n;k++)
for(int j=;j<=n;j++){
B[x][i][j]=(B[x][i][j]+B[x-][i][k]*B[][k][j])%mod;
}
}
for(int i=;i<=n;i++)A[][i][i]=B[][i][i]=;
for(int x=;x<=q;x++){
int t1=x/o,t2=x%o;
for(int i=;i<=n;i++){
ll tmp=;
for(int k=;k<=n;k++){
tmp=(tmp+A[t2][i][k]*B[t1][k][i])%mod;
}
ans=ans^tmp;
}
}
cout<<ans<<endl;
return ;
}

叶落归根(hometown)的更多相关文章

  1. POJ2774 Long Long Message [后缀数组]

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 29277   Accepted: 11 ...

  2. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  3. WPF绑定到集合

    什么是集合视图? 集合视图是位于绑定源集合顶部的一层,您可以通过它使用排序.筛选和分组查询来导航和显示源集合,而无需更改基础源集合本身.集合视图还维护着一个指向集合中的当前项的指针.如果源集合实现了 ...

  4. [转]Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)

    本文转自:https://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-o ...

  5. My year of 2016

    2016, year of excellence.   Year of happiness. In Beijing we can also find some happiness which is s ...

  6. mongoose数据库连接和操作

    var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...

  7. AJAX 与 MySQL

    AJAX 与 MySQL AJAX 可用来与数据库进行交互式通信. AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例   Select a person:   P ...

  8. 浅谈JSON

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没有 ...

  9. Swift3.0P1 语法指南——函数

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

随机推荐

  1. lvs+ipvsadm负载均衡

    使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...

  2. 平衡二叉查找树 AVL 的实现

    不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找).如何解决这个问题呢?关键在于如何最大限度的减小树的深度.正是基于这个想法,平衡二叉树出现了. 平衡二叉树的定义 (A ...

  3. python__基础 : sys模块: sys.argv与sys.path

    sys模块中的 argv 保存的是当你运行一个py文件的时候给他传递进去的参数,如: import sys a = sys.argv print(a) # 当在命令行中调用这个py文件: > p ...

  4. SQL-批量插入和批量更新

    批量插入 表结构一样或类似 如果两张表的结构一样,例如一个表的结构和另一个表的结构一样,只是其中一张是临时表,而另一张表是存储数据的表,我们需要进行一次表的迁移的话,我们可以这样. insert in ...

  5. 手机连上同一个局域网的PC,修改项目的vhost配置

    <VirtualHost 172.16.6.100:80> DocumentRoot "D:\phpStudy\WWW\mywork\many_school" Serv ...

  6. 编辑工具_vi

    vi/vim平时经常会用到,但是一直没有时间系统的整理下,今天看到了一篇不错的介绍文章.引用下,就当做笔记了,但是不晓得该怎么填引用路径,如有侵权请告知,补上引用路径 01. vi 简介 1.1 学习 ...

  7. Error: Cannot find module 'core-js/fn/array/values' at Function.Module._resolveFilename (module

    E:\codeBase\top605\rescue-master\server\node_modules\_log4js@1.1.1@log4js\lib\log4js.js:321 throw ne ...

  8. svn服务器的配置和使用

    安装好了svn服务器,打开 VisualSVN Server Manager 先新建用户和组,在代码库创建的时候可以指定哪些用户或者组有读写权限,也可以创建好后指定 创建用户 输入用户名和密码创建用户 ...

  9. 宝石TD迷宫设计器

    说起宝石TD,能追溯到我上高二那会,算来是2005年. 所谓一款TD类的魔兽RPG,宝石TD可以算是达到了TD迷宫的巅峰,三进三出更是别具匠心. 这个迷宫设计器是去年在焦作做的,只完成了迷宫设计功能, ...

  10. groupSum6后向遍历

    http://codingbat.com/prob/p199368 public boolean groupSum6(int start, int[] nums, int target) { if( ...