距阵的运用

昨晚大四的一个学长给我们讲了,距阵的使用,很不错,这里总结一下。

一般距阵,用在n很大,导致超时的问题上。它需要快速幂取模的辅助。

例子

求斐波那契数列   a1=1;    a2=1;     an=an-1+an-2;   求 an     (n>=1&&n<=108)    由于n很大结果对999999999取模;

对于这题n很大你直接推,每次取%999999999,明显会超时,

矩阵做法

这样就可以化为 矩阵(a1 a2)*矩阵(An-1)= 矩阵(an,an+1);

看代码

#include<stdio.h>
#include<string.h>
#define mod 999999999

__int64 a[5];
__int64 b[3][3];

__int64 quick_mod(__int64 n)
{
a[1]=1; a[2]=1;
b[1][1]=0; b[1][2]=1;
b[2][1]=1; b[2][2]=1;
while(n)
{
if(n&1)
{
__int64 s1,s2;
s1=(a[1]*b[1][1]%mod+a[2]*b[2][1]%mod)%mod;
s2=(a[1]*b[2][1]%mod+a[2]*b[2][2]%mod)%mod;
a[1]=s1;
a[2]=s2;
n--;
}
n=n/2;
__int64 k1,k2,k3,k4;
k1=(b[1][1]*b[1][1]%mod+b[1][2]*b[2][1]%mod)%mod;
k2=(b[1][1]*b[2][1]%mod+b[1][2]*b[2][2]%mod)%mod;
k3=(b[2][1]*b[1][1]%mod+b[2][2]*b[2][1]%mod)%mod;
k4=(b[2][1]*b[1][2]%mod+b[2][2]*b[2][2]%mod)%mod;
b[1][1]=k1; b[1][2]=k2; b[2][1]=k3; b[2][2]=k4;
}
return a[1];
}

int main(void)
{
__int64 n;
while(scanf("%I64d",&n)==1)
{
printf("%I64d\n",quick_mod(n-1));
}
return 0;
}

这样就运用快速幂取模大大减少了时间。

如果矩阵大一点的话这样写

#include<stdio.h>
#include<string.h>
#define mod 999999999

__int64 a[5];
__int64 b[3][3];

__int64 quick_mod(__int64 n)
{
__int64 i,j,k;
a[1]=1; a[2]=1;
b[1][1]=0; b[1][2]=1;
b[2][1]=1; b[2][2]=1;
while(n)
{
if(n&1)
{
__int64 s[3];
memset(s,0,sizeof(s));
for(i=1;i<=2;i++)
{
for(j=1;j<=2;j++)
{
s[i]=(s[i]+a[j]*b[j][i])%mod;
}
}
for(i=1;i<=2;i++)
a[i]=s[i];
n--;
}
n=n/2;
__int64 kk[5][5];
memset(kk,0,sizeof(kk));
for(i=1;i<=2;i++)
{
for(j=1;j<=2;j++)
{
for(k=1;k<=2;k++)
{
kk[i][j]=(kk[i][j]+b[i][k]*b[k][j])%mod;
}
}
}
for(i=1;i<=2;i++)
{
for(j=1;j<=2;j++)
{
b[i][j]=kk[i][j];
}
}
}
return a[1];
}

int main(void)
{
__int64 n;
while(scanf("%I64d",&n)==1)
{
printf("%I64d\n",quick_mod(n-1));
}
return 0;
}

时间: 2024-11-01 06:04:15

距阵的运用的相关文章

距阵相乘

将两个给定的距阵(3*3)相乘得到另一个距阵并将其打印出来. 输入 输入两个大小为3*3的距阵 输出 输出一个大小为3*3的距阵,矩阵每一行相邻的的两个数字之间由一个空格隔开.具体的请详见 Sample Output 样例输入 1 2 3 3 2 1 1 1 1 1 1 1 1 2 3 1 2 3 样例输出 6 11 16 6 9 12 3 5 7 #include<stdio.h> int main() { int a[3][3]={0},b[3][3]={0},c[3][3]={0},i,

HDU 2686 Matrix(最大费用流)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1890    Accepted Submission(s): 1005 Problem Description Yifenfei very like play a number game in the n*n Matrix. A positive integer numbe

洛谷1508 Likecloud-吃、吃、吃

题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物.李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃

密码学基础知识(三)古典密码

说完了前面那些,想起个事,本系列依据内容主要来自<现代密码学>马春光编著.我就是学这本书的. 好了,古典密码就是古时候的密码,哈哈,逗你玩的,shannon的保密系统的通信理论发表前的都是古典密码,会在密码学简史中介绍这位牛人的. 学习古典密码学的意义:学习设计原理和分析方法 古典密码也是,俩门派:置换和代换,顾名思义,一个是换了个原来有的,一个是换了个原来没有的.学术点讲就是前者明文和密文空间一样,后者 不一样.你要是问我啥是明文空间和密文空间啊,我就呵呵.是M 和 C.m明文的集合,c密文

摄像机视口屏幕投射

众所周知,当摄像机投影时,采用的是视觉圆锥进行的投射,类似手电筒向外照射光的时候. 在视觉圆锥内的就能被摄像机观察到. 但我们计算机屏幕是方形的,所以所显示的内容,只能是视觉圆锥的一部分,还有一部分被舍去了. 有两个关键点,一个是摄像机点,一个是观察点.观察点作为中心点,始终是显示的计算机屏幕中心的,我们可以把这个点作为基准点. 我们可以设定摄像机点与观察点始终是垂直于显示面的,也既计算机屏幕. 我们把视觉圆锥内所有的物体,由远及近向显示面(屏幕)进行投影,就形成了屏幕上显示的内容. 了解了视口

Excel教程(12) - 数学和三角函数

ABS     用途:返回某一参数的绝对值.   语法:ABS(number) 参数:number 是需要计算其绝对值的一个实数. 实例:如果 A1=-16,则公式"=ABS(A1)"返回 16. ACOS 用途:返回以弧度表示的参数的反余弦值,范围是 0~π. 语法:ACOS(number) 参数:number 是某一角度的余弦值,大小在-1-1 之间. 实例:如果 A1=0.5,则公式"=ACOS(A1)"返回 1.047197551(即 π/3 弧度,也就是

Likecloud-吃、吃、吃(洛谷 1508)

题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物.李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃

《黑客帝国》完全解析(转)

万事皆有始亦有终——<The Matrix>影评之终结篇  一.前言 从 Matrix I 到 Matrix III,整整四年,一对名叫沃卓斯基(导演加编剧)的兄弟给科幻电影带来一次史无前例的冲击,无论从思想上还是视觉效果上都超过了以往任何一部科幻电影,从来没有一部科幻电影能够创造这么多的 Fans 也没有任何一部科幻电影能像 Matrix 这样引发如此大规模的讨论——讨论剧情,讨论主题,讨论特效,讨论演员,笔者绝不敢自称 100% 的看懂了(我把看懂定义为“理解沃卓斯基兄弟眼中剧情和主题的原

【iOS】iPhone截图并添加水印

+(UIImage *)screenForView:(UIView *)view { // UIGraphicsBeginImageContext(view.frame.size); // CGContextRef context = UIGraphicsGetCurrentContext(); // [view.layer renderInContext:context]; // UIImage *theImage = UIGraphicsGetImageFromCurrentImageCon