`

HDU 3221 Brute-force Algorithm

阅读更多
/*
*  [题意]
*   略
*  [解题方法]
*   设g为所求。
*   观察可知:g(1) = a; g(2) = b; g(3) = a*b; g(4) = a*(b^2); g(5) = (a^2)*(b^3)...
*   易得:g(n) = g(n-1)*g(n-2)
*   所以对于a的幂或b的幂有:f(n) = f(n-1)+f(n-2)
*   设矩阵A = |1 1|
*            |1 0|
*   令B = A^(n-2),得:
*   g(n)中b的幂 = B[0][0];
*   g(n)中a的幂 = B[0][1];
*   {上述为斐波那契矩阵的性质}
*   由于是幂,所以矩阵乘法时需要用到降幂公式进行取余
*   详情请参考:http://972169909-qq-com.iteye.com/blog/1278667
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define LL long long
#define FF(i, n) for(int i = 0; i < n; i++)
#define M 2

int ret[M][M], mod, phi;
int init[M][M];
int ss[M][M] = {1, 1, 1, 0};

void ini(int n)
{
    FF(i, n) FF(j, n) init[i][j] = ss[i][j];
}

void matmul(int a[][M], int b[][M], int n)
{
    LL tp[M][M] = {0};
    FF(i, n) FF(k, n) if(a[i][k]) FF(j, n) if(b[k][j])
    {
        tp[i][j] = tp[i][j] + (LL)a[i][k]*b[k][j];
        //降幂公式的条件
        if (tp[i][j] >= phi) tp[i][j] = tp[i][j] % phi + phi;
    }
    FF(i, n) FF(j, n) a[i][j] = tp[i][j];
}

void qmod(int n, int b)
{
    FF(i, n) FF(j, n) ret[i][j] = (i==j);
    for ( ; b; b >>= 1)
    {
        if (b & 1) matmul(ret, init, M);
        matmul(init, init, M);
    }
}

LL cal(LL a, LL b)
{
    LL res = 1;
    for ( ; b; b >>= 1)
    {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
    }
    return res;
}

int Euler(int n)    //欧拉函数
{
    int i, res = n;
    for (i = 2; (LL)i * i <= n; i++)
    {
        if (n % i == 0)
        {
            do
            n /= i;
            while (n % i == 0);
            res = res - res/i;
        }
    }
    if (n > 1) res = res - res/n;
    return res;
}

int main()
{
    int t, cc = 0, n, a, b;
    cin >> t;
    while (t--)
    {
        cin >> a >> b >> mod >> n;
        cout << "Case #" << (++cc) << ": ";
        if (n == 1) {
            cout << a%mod << endl;
            continue;
        }
        if (n == 2) {
            cout << b%mod << endl;
            continue;
        }
        phi = Euler(mod);
        ini(M);
        qmod(M, n-2);
        int ans = cal(a, ret[0][1])*cal(b, ret[0][0]) % mod;
        cout << ans << endl;
    }
    return 0;
}

 

1
2
分享到:
评论

相关推荐

    HDU-EID-V2-核心板1

    在本话题中,我们关注的是一个名为"HDU-EID-V2-核心板1"的特定设计,它涉及到STM32的核心组件、接口、电源管理和调试配置。 首先,核心板设计中提到了F103和F207两个型号的STM32芯片。F103和F207属于STM32的不同...

    HDU+2000-2099+解题报告

    4. **字符串处理**:如KMP算法、Manacher's Algorithm、后缀数组、Z-Algorithm等,常用于查找模式匹配和文本处理。 5. **数论**:包括最大公约数(GCD)、最小公倍数(LCM)、模逆、线性同余方程、素数判断等。 6. **...

    hdu-OS-simple-shell,Linux_的_Shell_命令窗口_demo_版实现_shell-demo.zip

    hdu-OS-simple-shell,Linux_的_Shell_命令窗口_demo_版实现_shell-demo

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    2019-hdu-multi-(2019杭电多校第二场数据与标程).zip

    《2019-hdu-multi-(2019杭电多校第二场数据与标程).zip》是一个专门针对编程竞赛爱好者和ACM(国际大学生程序设计竞赛)参赛者的资源包。这个压缩文件的核心内容是2019年杭州电子科技大学(HDU)主办的多校联合...

    HDU-2000-2099.zip_hdu2000

    【标题】"HDU-2000-2099.zip_hdu2000" 是一个包含杭电(Hangzhou Dianzi University)ACM竞赛题目解题报告的压缩包,覆盖了编号从2000到2099的题目。这个资源对于学习算法、提高编程技巧以及准备ACM/ICPC(国际大学...

    HDU-2000-2099.rar_hdu

    这个名为"HDU-2000-2099.rar_hdu"的压缩包包含了该平台从2000到2099共100道题目的源代码。这些题目涵盖了初级到高级的各种算法,对于学习和提升编程技能非常有帮助。 首先,我们来看看这些题目可能涉及到的基础知识...

    HDU-1535-.zip_多源点

    标题中的"HDU-1535-.zip_多源点"表明这是一个关于解决 ACM (国际大学生程序设计竞赛)问题的程序代码包,问题编号为 HDU 1535,且该问题涉及到多源点的最短路径计算。描述中提到的"求多源点到单终点的最短路(反向...

    HDU-EID-V2-扩展板1

    HDU-EID-V2-扩展板1是一款专为STM32微控制器设计的硬件扩展板,主要用于增强核心板的功能。该扩展板具有多种接口和功能,包括ADC(模数转换器)、电位器、DAC(数模转换器)输出以及TEST_V跳线,能够满足用户在模拟...

    hdu-page-11-answer.rar_hdu_hdu oj第十一页_page_搜题_杭电oj

    本资料"HDU Page 11 Answer"正是针对杭电OJ中第11页的题目,提供了一系列题解,旨在帮助初学者快速掌握基础算法,并提升编程能力。 一、ACM入门基础知识 ACM竞赛强调的是团队协作和快速解决问题的能力,其核心是...

    ACM HDU 2000-2099 解题报告 杭电 ACM

    《ACM HDU 2000-2099 解题报告 杭电 ACM》是一份详尽的编程竞赛解题集,主要涵盖了杭电(Hangzhou Dianzi University)在线判题系统(HDU OJ)上的2000至2099号题目。这份解题报告是针对参与ACM/ICPC(国际大学生...

    HDU ACMSteps-Chapter One-Section One答案集修正版

    杭州电子科技大学ACM Steps中Chapter One-Section One的答案集。不要直接抄哦~~ 如需题解请上我的博客~ 博客地址呈上:http://blog.csdn.net/xu_zh

    HDU-Coder-X#Daily-question-of-Leetcode#2021-09-24-430. 扁平化多级双向链表

    示例 1:输出:[1,2,3,7,8,11,12,9,10,4,5,6]输入的多级列表如下图所示:扁平化后的链表如下图:示例 2:输出:[1,3,2]解释:输入

    HDU-Coder-X#Daily-question-of-Leetcode#2022-04-04-307. 区域和检索 - 数

    其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和

    HDU ACMSteps-Chapter One-Section Two答案集修正版

    杭州电子科技大学ACM Steps中Chapter One-Section Two的答案集。不要直接抄哦~~ 如需题解请上我的博客~ 博客地址呈上:http://blog.csdn.net/xu_zh

    HDU-Coder-X#Daily-question-of-Leetcode#2021-12-12-709. 转换成小写字母1

    示例 1:示例 2:解答:大小写转换: n = n ^ 32转小写: n = n | 32转大写: n = n & -33const toLowerCase =

    HDU-Coder-X#Daily-question-of-Leetcode#2022-02-26-2016. 增量元素之间的最

    2016. 增量元素之间的最大差值题目描述:给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i]

Global site tag (gtag.js) - Google Analytics