• 【bzoj5118】Fib数列2 费马小定理+矩阵乘法


    题目描述

    Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2)
    现给出N,求Fib(2^n).

    输入

    本题有多组数据。第一行一个整数T,表示数据组数。
    接下来T行每行一个整数N,含义如题目所示。
    n≤10^15, T≤5

    输出

    输出共T行,每行一个整数为所求答案。
    由于答案可能过大,请将答案mod 1125899839733759后输出

    样例输入

    2
    2
    31

    样例输出

    3
    343812777493853


    题解

    费马小定理+矩阵乘法

    傻逼题,根据费马小定理,指数在模 $p-1$ 意义下相等时幂数相等。

    因此求出 $2^n$ 在模 $p-1$ 意义下的结果,再用矩阵乘法维护fib数列,求矩阵的 $2^n ext{mod} (p-1)$ 次幂即可。

    模数较大因此使用快(man)速乘,时间复杂度 $O(log^2n)$ 。

    #include <cstdio>
    #include <cstring>
    #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
    " , A[1][0]);
    	}
    	return 0;
    }
    

     

  • 相关阅读:
    MySQL命令行基本操作
    MYSQL多表查询笔记
    MYSQL事务笔记
    Linux测试环境部署相关命令和步骤
    Jmeter录制脚本
    办公软件通讯录排序相关测试点
    Burp Suite抓包App
    安全测试 Burp Suite抓包工具
    及时通信办公软件,验证码登录,获取验证码失败原因分析和规避方法
    redis内存溢出问题分析和后续规避方法
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/8711060.html
Copyright © 2020-2023  润新知