zoukankan      html  css  js  c++  java
  • 斐波那契数列第n项

    1:斐波那契数列第n项
    在斐波那契数列中,Fib0=0,Fib1=1,Fibn=Fibn−1+Fibn−2(n>1)。

    给定整数n,求Fibn mod10000。

    输入格式
    输入包含多组测试用例。

    每个测试用例占一行,包含一个整数n。

    当输入用例n=-1时,表示输入终止,且该用例无需处理。

    输出格式
    每个测试用例输出一个整数表示结果。

    每个结果占一行。

    数据范围
    0≤n≤2∗109
    输入样例:
    0
    9
    999999999
    1000000000
    -1
    输出样例:
    0
    34
    626
    6875

    思路:矩阵快速幂 , 每次取模 。

    #include <stdio.h>
    #include <string.h>
    long long n,mod=10000;
    void Matrix1(long long a[2],long long b[2][2])
    {
    	long long c[2]={0};
    	for(int j=0;j<2;j++)
    		{
    			for(int k=0;k<2;k++)
    			{
    				c[j]=(c[j]+a[k]*b[k][j]%mod)%mod;
    			}
    		}
    		memcpy(a,c,sizeof(c));
    }
    void Matrix2(long long b[2][2])
    {
    	long long c[2][2]={0};
    	for(int i=0;i<2;i++)
    	{
    		for(int j=0;j<2;j++)
    		{
    			for(int k=0;k<2;k++)
    			{
    				c[i][j]=(c[i][j]+b[i][k]*b[k][j]%mod)%mod;
    			}
    		 } 
    	}
    	memcpy(b,c,sizeof(c));
    }
    int main()
    {
    	while(~scanf("%lld",&n))
        {   
            if(n==-1) break;
            else
            {  
                long long a[2]={0,1};
                long long b[2][2]={0,1,1,1};
    	        while(n)
    	        {
    		    if(n&1)	Matrix1(a,b);
    		    Matrix2(b);
    		    n>>=1;
    	        }
    	    printf("%lld
    ",a[0]);
            }
        }
        return 0;
    }
    

    2:斐波那契数列 10’
    描述
    已知斐波那契数列 1,1,2,3,5,8,13,21每一项是前两项的和。

    请告诉laofu,第202003281331项的最后一位是多少。(大家写到这题,是不是这个时间呢,嘿嘿~)

    例如:第八项的最后一位是1

    【答案提交】

    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。

    思路:最后一位只和最后一位有关,所以每次模10取最后一位。

    #include <stdio.h>
    #include <string.h>
    long long n,mod=10,a[2]={0,1},b[2][2]={0,1,1,1};
    void Matrix1(long long a[2],long long b[2][2])
    {
    	long long c[2]={0};
    	for(int j=0;j<2;j++)
    		{
    			for(int k=0;k<2;k++)
    			{
    				c[j]=(c[j]+a[k]*b[k][j]%mod)%mod;
    			}
    		}
    		memcpy(a,c,sizeof(c));
    }
    void Matrix2(long long b[2][2])
    {
    	long long c[2][2]={0};
    	for(int i=0;i<2;i++)
    	{
    		for(int j=0;j<2;j++)
    		{
    			for(int k=0;k<2;k++)
    			{
    				c[i][j]=(c[i][j]+b[i][k]*b[k][j]%mod)%mod;
    			}
    		 } 
    	}
    	memcpy(b,c,sizeof(c));
    }
    int main()
    {
    	scanf("%lld",&n);
        while(n)
    	   {
    		  if(n&1)	Matrix1(a,b);
    		  Matrix2(b);
    		  n>>=1;
    	   }
        printf("%lld
    ",a[0]);
        return 0;
    }
    
  • 相关阅读:
    【译】Arc 在 Rust 中是如何工作的
    TCP连接时动态端口的相关问题说明
    技巧:如何区分dll程序集的编译目标平台(同样适用于查看程序集的其它依赖)
    探究:nuget工具对不再使用的dll文件的处理策略
    .net core迁移实践:项目文件csproj的转换
    nuget使用经验:复杂依赖关系下的包版本问题
    rsyslog学习和使用记录
    死锁场景:双Update操作的情况
    kubernetes官网对中国区的优待
    数据库死锁分析和说明:select和update死锁场景举例
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847977.html
Copyright © 2011-2022 走看看