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;
}


目录
相关文章
|
4月前
|
人工智能 算法 BI
class077 区间dp-下【算法】
class077 区间dp-下【算法】
32 0
|
4月前
|
算法 机器人
class051 二分答案法与相关题目【算法】
class051 二分答案法与相关题目【算法】
29 0
|
4月前
|
算法
class076 区间dp-上【算法】
class076 区间dp-上【算法】
23 0
|
4月前
|
算法 定位技术 索引
class064 Dijkstra算法、分层图最短路【算法】
class064 Dijkstra算法、分层图最短路【算法】
31 0
树的子结构(剑指offer 26)Java先序遍历+子结构判断
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。
树的子结构(剑指offer 26)Java先序遍历+子结构判断
汉诺塔问题, 用递归方法求集合中的中位数
汉诺塔问题, 用递归方法求集合中的中位数
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 2】AcWing92. 递归实现指数型枚举
【递归与递推 2】AcWing92. 递归实现指数型枚举
【递归与递推 1】AcWing94.递归实现排列型枚举
【递归与递推 1】AcWing94.递归实现排列型枚举
斐波那契的整除(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