[bzoj5118]Fib数列2_费马小定理_矩阵乘法

Fib数列2 bzoj-5118

题目大意:求Fib($2^n$)。

注释:$1\le n\le 10^{15}$。

想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定理就tm完事了,将fib数列的通项公式列出来然后费马小定理...

最后,附上丑陋的代码... ...(照着郭爷一顿瞎jb敲)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1125899839733759
typedef long long ll;
inline ll mul(ll x,ll y,ll p)
{
	ll ans=0;
	while(y)
	{
		if(y&1) ans=(ans+x)%p;
		x=(x+x)%p,y>>=1;
	}
	return ans;
}
inline ll pow(ll x,ll y,ll p)
{
	ll ans=1;
	while(y)
	{
		if(y&1) ans=mul(ans,x,p);
		x=mul(x,x,p),y>>=1;
	}
	return ans;
}
struct data
{
	ll v[2][2];
	data(){memset(v,0,sizeof(v));}
	ll*operator [] (int a){return v[a];}
	data operator * (data a)
	{
		data ans;
		int i,j,k;
		for(i=0;i<2;i++)
			for(k=0;k<2;k++)
				for(j=0;j<2;j++)
					ans[i][j]=(ans[i][j]+mul(v[i][k],a[k][j],mod))%mod;
		return ans;
	}
	data operator^(ll y)
	{
		data x=*this,ans;
		ans[0][0]=ans[1][1]=1;
		while(y)
		{
			if(y&1)ans=ans*x;
			x=x*x,y>>=1;
		}
		return ans;
	}
}A;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		ll n;
		scanf("%lld",&n),n=pow(2,n,mod-1);
		A[0][0]=0,A[0][1]=A[1][0]=A[1][1]=1,A=A^n;
		printf("%lld\n",A[1][0]);
	}
	return 0;
}

小结:好题

原文地址:https://www.cnblogs.com/ShuraK/p/9315584.html

时间: 2024-11-12 18:49:41

[bzoj5118]Fib数列2_费马小定理_矩阵乘法的相关文章

bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

题目大意:求fib(2^n) 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 于是这题就完了 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h> #define ll long long #define MOD(x) ((x)>=mod?(x-mod):(x)) using namespace std; const int maxn=500010; const ll mod=1125899839733759; struct m

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

HDOJ 4549 M斐波那契数列 费马小定理+矩阵快速幂

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 根据费马小定理  a^phi( p ) = 1 ( mod p )  这里 p 为质数 且 a 比 p小 所以 a^( p - 1 ) = 1 ( mod p ) 所以对很大的指数可以化简  a ^ k % p  == a ^ ( k %(p-1) ) % p 用矩阵快速幂求fib数后代入即可 M斐波那契数列 Time Limit: 3000/1000

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

M斐波那契数列(矩阵快速幂+费马小定理)

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1672    Accepted Submission(s): 482 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,

HDOJ M斐波那契数列 4549【矩阵快速幂+快速幂+费马小定理+欧拉函数】

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2096    Accepted Submission(s): 596 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可

hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,