NOIP2016模拟 妹子(矩阵快速幂)

 1 #include "bits/stdc++.h"
 2 #define mem(a,b) memset(a,b,sizeof(a))
 3 using namespace std;
 4 typedef long long LL;
 5 const int MAX=105;
 6 const int MOD=1000000007;
 7 LL n,m;
 8 struct Mat{
 9     LL x,y;
10     LL mat[MAX][MAX];
11     Mat (){x=y=0,mem(mat,0);}
12     Mat operator *(const Mat &cc){
13         LL i,j,k;
14         Mat vv;
15         vv.x=x,vv.y=cc.y;
16         for (i=1;i<=vv.x;i++)
17          for (k=1;k<=cc.x;k++)
18           if (mat[i][k])
19            for (j=1;j<=vv.y;j++)
20             vv.mat[i][j]=(vv.mat[i][j]+mat[i][k]*cc.mat[k][j])%MOD;
21         return vv;
22     }
23 }a,ans;
24 Mat ksm(Mat p,int k){
25     int i,j;
26     Mat an;
27     an.x=p.x,an.y=p.y;
28     for (i=1;i<=an.x;i++)
29      an.mat[i][i]=1;
30     while (k){
31         if (k&1)
32          an=an*p;
33         p=p*p;
34         k>>=1;
35     }
36     return an;
37 }
38 int main(){
39     freopen ("harem.in","r",stdin);
40     freopen ("harem.out","w",stdout);
41     LL i,j;
42     scanf("%lld%lld\n",&n,&m);
43     char c;
44     for (i=1;i<=m;i++){
45         for (j=1;j<=m;j++){
46             c=getchar();
47             if (c==‘0‘)
48              a.mat[i][j]=1;
49         }
50         c=getchar();
51     }
52     for (i=1;i<=m+1;i++)
53      a.mat[i][m+1]=a.mat[m+1][i]=1;
54     a.x=m+1,a.y=m+1;
55     ans.x=m+1;ans.y=1;
56     for (i=1;i<=ans.x;i++)
57      ans.mat[i][1]=1;
58     ans=ksm(a,n-1)*ans;
59     LL Ans(0);
60     for (i=1;i<=m+1;i++)
61      Ans=(ans.mat[i][1]+Ans)%MOD;
62     printf("%lld",Ans);
63     return 0;
64 }
时间: 2024-12-25 22:23:48

NOIP2016模拟 妹子(矩阵快速幂)的相关文章

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

HDU 4896 Minimal Spanning Tree(矩阵快速幂)

题意: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一个循环,接下来的9个点连回去的边都是一样的.预处理出5个点的所有连通状态,总共只有52种,然后对于新增加一个点和前面点的连边状态可以处理出所有状态的转移.然后转移矩阵可以处理出来了,快速幂一下就可以了,对于普通的矩阵乘法是sigma( a(i, k) * b(k, j) ) (1<=k<=N), 现在

POJ 3070 Fibonacci(矩阵快速幂模板)

Description: In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alternative formula for the Fibonacci sequence i

HDU 2294 Pendant (DP+矩阵快速幂降维)

HDU 2294 Pendant (DP+矩阵快速幂降维) ACM 题目地址:HDU 2294 Pendant 题意: 土豪给妹子做首饰,他有K种珍珠,每种N个,为了炫富,他每种珍珠都要用上.问他能做几种长度[1,N]的首饰. 分析: 1 ≤ N ≤ 1,000,000,000简直可怕. 首先想dp,很明显可以想到: dp[i][j] = (k-(j-1))*dp[i-1][j-1] + j*dp[i-1][j](dp[i][j]表示长度为i的并且有j种珍珠的垂饰有多少个) 然后遇到N太大的话,

算法录 之 快速幂快速乘和矩阵快速幂。

1: 问题如下: 求 a^n % m 的值是多少?n是1到10^18次方的一个整数. 求一个数的n次方,朴素的算法就是直接for循环,O(N)的复杂度. 但是对于这个问题n实在是太大了,O(N)也会超时,那么需要更快的算法,快速幂算法. 要求 a^n,如果知道了 a^(n/2) 次方的话,再来个平方就可以了. 那么按照这个思路就能运用分治的思想了. 代码如下: 1 int _pow(int a,long long n,int m) { 2 if(n==0) return 1 % m; 3 4 l

【矩阵快速幂】数列

[NOIP模拟赛]数列 [题目描述] a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a 数列的第n 项对1000000007(10^9+7)取余的值. [输入格式] 第一行一个整数T,表示询问个数. 以下T 行,每行一个正整数n. [输出格式] 每行输出一个非负整数表示答案. [样例输入]36810 [样例输出]4919 [数据范围] 对于30%的数据 n<=100: 对于60%的数据 n<=2*10^7: 对于100%的数据 T<=100,

矩阵快速幂专题(三)

哈哈哈,博主又回来了!这次专题是第三弹也是最后一弹了,这次会对矩阵进行一个小收尾.做完这25道题,我感觉到其实我矩阵学得并不好,还有许多知识点没有学会.后面看情况可能还会继续开矩阵的专题,那应该是几个月以后的事了.从下周开始,应该会先学习一下数论的相关算法! 这次的七道题目(为什么题目越来越少了)主要是针对了矩阵的优化,对于会TLE的和MLE(内存爆了)的矩阵而且这个矩阵又恰好是同构矩阵(同构矩阵是啥?)的话,可以采用一维数组来模拟二维,从而降低复杂度.降低空间.(竟然是罕见的同时降时间和空间的

省选算法学习-矩阵与矩阵快速幂

0x00 引入 矩阵,顾名思义,就是由数构成的矩形阵列 比如这样的:$\begin{array}{l}\begin{bmatrix}2&3&4\0&7&13\c&\alpha&\sqrt5\end{bmatrix}\\end{array}$ 就是一个3*3的矩阵 矩阵在信息学乃至数学里面的用处都非常广泛,下面就来介绍下它的一些基本知识,以及常用的地方.本文同时还会介绍矩阵快速幂以及快速矩阵乘法. 0x01 何为矩阵 矩阵的定义 其实就是上面那样的啦.....