zoukankan      html  css  js  c++  java
  • [bzoj5118]Fib数列2_费马小定理_矩阵乘法

    Fib数列2 bzoj-5118

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

    注释:$1le nle 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
    ",A[1][0]);
    	}
    	return 0;
    }
    

     小结:好题

  • 相关阅读:
    P85 实战练习
    Java语句及控制台输入
    P62 实战练习
    运算符、数据类型转换和注释
    Java变量与常量
    Java语法初步实际应用
    JQ 练习题
    JQ 特效下拉列表 写出与css一样的效果
    JQ 全选设定与设置选中
    JQ JSON数据类型
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9315584.html
Copyright © 2011-2022 走看看