哇,其实我2A该。。。。否1A纯脑损伤。。

乞讨:F(a^b)^(F(a^b) ^ (n-1))%c 

既是求F(a^b)^(F(a^b) ^ (n-1)%phi[c]+phi[c])%c

先求x=F(a^b)%phi[c],有循环节,直接找到循环节就OK。

然后求y=F(a^b)%c,同求x,循环节。

然后问题就变成求y^(x^(n-1)%phi[c]+phi[c])

直接套两次高速幂取模就OK。

#include <iostream>

#include<stdio.h>

#include<vector>

#include<queue>

#include<stack>

#include<string.h>

#include<algorithm>

#include<math.h>

using namespace std;

#define LL unsigned __int64

#define lcm(a,b) (a*b/gcd(a,b))

//O(n)求素数,1-n的欧拉数

#define N 110000

struct math_use

{

    LL euler(LL x)

    {

        LL i, res = x;

        for (i = 2; i*i <= x; i++)

            if (x%i == 0)

            {

                res = res / i*(i - 1);

                while (x%i == 0)

                    x /= i;

            }

        if (x > 1)

            res = res / x*(x - 1);

        return res;

    }

//a^b%c

    LL q_mod(LL a,LL b,LL n)

    {

        LL ret=1;

        LL tmp=a;

        while(b)

        {

            //基数存在

            if(b&0x1) ret=ret*tmp%n;

            tmp=tmp*tmp%n;

            b>>=1;

        }

        return ret;

    }

} M;

int smod[330];

int eur[330];

LL s_mod(int mod)

{

    LL a1,a2,a3,tmp;

    a1=0;

    a2=1;

    a3=1;

    LL ans=1;

    while(a2!=0||a3!=1)

    {

        tmp=(a2+a3)%mod;

        a2=a3;

        a3=tmp;

        ans++;

    }

    return ans;

}

void init()

{

    smod[1]=1;

    eur[1]=M.euler(1);

    for(int i=2; i<=300; i++)

    {

        smod[i]=s_mod(i);

        eur[i]=M.euler(i);

    }

}

LL get_fib(int x,int mod)

{

    if(x==0)return 0;

    LL a1,a2,a3,tmp;

    a1=0;

    a2=a3=1;

    x--;

    while(x--)

    {

        tmp=(a2+a3)%mod;

        a2=a3;

        a3=tmp;

    }

    return a2;

}

LL fib(LL a,LL b,LL mod)

{

    LL ans=1;

    int yu=smod[mod];

    LL s=M.q_mod(a%yu,b,yu);

    return get_fib(s,mod);

}

int main()

{

    LL a,b,n,c;

    init();

    LL T;

    cin>>T;

    int cas=0;

    while(T--)

    {

        cas++;

        cin>>a>>b>>n>>c;

        if(c==1)

        {

            printf("Case %d: 0\n",cas);

            continue;

        }

        LL x,y;

        LL mod,mod1;

        mod=c;

        mod1=eur[c];

        x=fib(a,b,mod1);

        y=fib(a,b,mod);

        LL p=M.q_mod(x,(n-1)%eur[mod1]+eur[mod1],mod1);

        LL ans=M.q_mod(y,p+mod1,mod);

        printf("Case %d: ",cas);

        cout<<ans<<endl;

    }

    return 0;

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdu-2814-Interesting Fibonacci-斐波那契周期节的更多相关文章

  1. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  2. Java Fibonacci 斐波那契亚

    Java Fibonacci 斐波那契亚 /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternat ...

  3. 递归算法之Fibonacci 斐波那契数列第n个数的求解

    Fibonacci 斐波那契数列第n个数的求解,也可以用递归和非递归的形式实现,具体如下,dart语言实现. int fibonacci(int n) { if (n <= 0) throw S ...

  4. lintcode:Fibonacci 斐波纳契数列

    题目: 斐波纳契数列 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, ...

  5. hdu number number number 斐波那契数列 思维

    http://acm.hdu.edu.cn/showproblem.php?pid=6198 F0=0,F1=1的斐波那契数列. 给定K,问最小的不能被k个数组合而成的数是什么. 赛后才突然醒悟,只要 ...

  6. hdu 4983 线段树+斐波那契数

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d, 修改k的为值增加d 2 l r, 查询l到r的区间和 3 l r, 从l到r区间 ...

  7. 算法导论-求(Fibonacci)斐波那契数列算法对比

    目录 1.斐波那契数列(Fibonacci)介绍 2.朴素递归算法(Naive recursive algorithm) 3.朴素递归平方算法(Naive recursive squaring) 4 ...

  8. HDOJ/HDU 5686 Problem B(斐波拉契+大数~)

    Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种 ...

  9. HDU 1568 快速求斐波那契前四位

    思路: 把斐波那契通项公式转化成log的形式,高中数学... //By SiriusRen #include <bits/stdc++.h> using namespace std; ], ...

  10. hdu 4099 字典树 + 斐波那契

    题意:       给你一个串(最长40位)问你这个串是斐波那契F(n)  n <= 99999中的那个数的前缀,如果存在多个输出最小的n否则输出-1. 思路:       给的串最长40位,那 ...

随机推荐

  1. PHP中抽象类与接口的应用场景

    <?php /*** ====笔记部分==== 接口的具体语法: 0:以人类为, class Human 是人的草图 而接口 是零件 可以用多种零件组合出一种新特种来. 1: 如上,接口本身即是 ...

  2. 显示形状回归算法(ESR)代码介绍

    源地址:http://www.thinkface.cn/thread-3704-1-6.html 人脸对齐包括两个部分,分别为训练部分和测试部分.所有的代码基于opencv2.0.(一)训练阶段Ste ...

  3. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  4. Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1

    在大学期间我做过非常多类似这种APP.这个是我们小组之前做的,我后期增加非常多新元素.完好了这个应用,由于为了加强 专业技术嘛.也是常常熬夜写些小东西,嘿嘿.只是还算不错.起码技术长进了不少嘛,还是非 ...

  5. ThinkPHP 的模型使用对数据库增删改查(五)

    原文:ThinkPHP 的模型使用对数据库增删改查(五) ThinkPHP 的模型使用 // 直接连接数据库,但是得先去配置文件中配置下才行 class IndexAction extends Act ...

  6. Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)

    结论:  数组,无论是否声明为transient,都是可以序列化.反序列化的. 测试情况如下: 1.两种类型的数组:int .String: 2 声明为transient  或者不做任何修饰:. 3. ...

  7. csdn android视频播放器开发

    http://blog.csdn.net/column/details/myvideo.html

  8. java 获取当期时间之前几小时的时间

    Calendar expireDate = Calendar.getInstance(); expireDate.set(Calendar.HOUR_OF_DAY, expireDate.get(Ca ...

  9. Android采用Application总结一下

    什么是 Application Application和Activity,Service由于是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象.用 ...

  10. Wix打包系列(七) 添加系统必备组件的安装程序

    原文:Wix打包系列(七) 添加系统必备组件的安装程序 我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件.这里以.Net Fr ...