NEFU 41 斐波那契性质

简介:

网址:http://acm.nefu.edu.cn/test/problemshow.php

题意:f[1] = 1; f[2] = 2;f[n] = f[n - 1] + f[n - 2];

And s[n] is defined:

  ans = as[x] % n;

根据性质:f[0]^2+f[1]^2+...+f[n]^2=f[n]*f[n+1] 

ans=a^(f[x]*f[x+1]-1)%n再根据欧拉定理向下降幂就可以了。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=2;
typedef long long int64;
typedef long long ll;
long long M;
bool f;
typedef struct
{
    long long m[MAX][MAX];
} Matrix;
Matrix P=
{
    1,1,
    1,0,
};
Matrix I=
{
    1,0,
    0,1,
};
Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法
{
    int i,j,k;
    Matrix c;
    for (i = 0 ; i < MAX; i++)
        for (j = 0; j < MAX; j++)
        {
            c.m[i][j] = 0;
            for (k=0; k<MAX; k++)
            {
                c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
                if(c.m[i][j]>M)
                    c.m[i][j]%=M,f=1;
            }
            c.m[i][j]%=M;
        }
    return c;
}
Matrix quickpow(long long n)
{
    Matrix m = P, b = I;
    while (n >= 1)
    {
        if (n & 1)
            b = matrixmul(b,m);
        n = n >> 1;
        m = matrixmul(m,m);
    }
    return b;
}
long long phi(long long n)
{
    long long rea=n;
    for(long long i=2; i*i<=n; i++)
        if(n%i==0)
        {
            rea=rea-rea/i;
            do
                n/=i;
            while(n%i==0);
        }
    if(n>1)
        rea=rea-rea/n;
    return rea;
}
long long Mulmod(ll a,ll b,ll n)
{
    ll  exp = a%n, res = 0;
    while(b)
    {
        if(b&1)
        {
            res += exp;
            if(res>n) res -= n;
        }
        exp <<= 1;
        if(exp>n)
            exp -= n;
        b>>=1;
    }
    return res;
}
long long exp_mod(ll a,ll b,ll c)
{
    ll k = 1;
    while(b)
    {
        if(b&1)
            k = k*a%c;
        a = a*a%c;
        b>>=1;
    }
    return k;
}
int main()
{
    long long a,x,n,s;
    while(~scanf("%lld%lld%lld",&a,&x,&n),a+x+n)
    {
        f=0;
        M=phi(n);
        if(x==1)
            s=1;
        else if(x==2)
            s=5;
        else
        {
            Matrix ans=quickpow(x-2);
            long long s1=ans.m[0][0]*2+ans.m[0][1];
            ans=matrixmul(ans,P);
            long long s2=ans.m[0][0]*2+ans.m[0][1];
            if(f||s1*s2>M)
                f=1,s=Mulmod(s1,s2,M)-1,s=s<0?s+M:s;
            else
                s=s1*s2-1;
        }
        if(s>M)
            s%=M,f=1;
        long long ansn;
        if(f)
            ansn=exp_mod(a,s+M,n);
        else
            ansn=exp_mod(a,s,n);
        printf("%lld\n",ansn);
    }
    return 0;
}


目录
相关文章
|
7月前
|
1月前
递归求解汉诺塔问题(超详解)
递归求解汉诺塔问题(超详解)
|
5月前
|
存储 算法 C语言
约瑟夫问题及求解方法
约瑟夫问题及求解方法
84 0
|
11月前
最小生成树两种方法实现
最小生成树两种方法实现
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
斐波那契的整除(nefu 115)
已知斐波那契数列有如下递归定义:f1 = 1,f2 = 1,且对于n >= 3,有fn = fn-1 + fn-2,它的前几项可以表示为1, 1,2 ,3 ,5 ,8,13,21,34…问fn的值是否能被 3 和 4 整除?
173 0
n阶幻方类的实现(C++)
有这样的一个魔方,1放在第一行的中间位置,随后输入1~n²
215 0
n阶幻方类的实现(C++)
|
人工智能 BI
斐波那契II--规律/二分
小C养了一些很可爱的兔子。 有一天,小C突然发现兔子们都是严格按照伟大的数学家 斐波那契 提出的模型来进行繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子。我们假定,在整个过程中兔子不会出现任何意外。 小C把兔子按出生顺序,把兔子们从1开始标号,并且小C的兔子都是1号兔子和1号兔子的后代。如果某两对兔子是同时出生的,那么小C会将父母标号更小的一对优先标号。如果我们把这种关系用图画下来,前六个月大概就是这样的:
164 0
斐波那契II--规律/二分
|
存储 算法 Python
最小生成树的本质是什么?Prim算法道破天机
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 从边到点 我们简单回顾一下Kruskal算法的原理,虽然上篇文章当中用了很多篇幅,但是原理非常简单。
最小生成树的本质是什么?Prim算法道破天机
|
机器学习/深度学习 算法 Java