/* * [题意] * 略 * [解题方法] * 设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; }
相关推荐
ACM题库,一些题目和答案,以及解题报告,传上来共享
ACM HDU 2000->2099 解题报告 ACM HDU 2000->2099 解题报告 ACM HDU 2000->2099 解题报告
杭电OnlineJudge 200-2099的解题报告
HDU 里面的2000~2099道题目的源码。谢谢支持
可拆卸核心板滤波电容电源指示灯排针复位F103--R10不焊F207--R9不焊第19引脚F103--C4焊0欧姆,C3不焊Tuesday, August 31
排母,核心板接口ADC 电位器扩展接口,预留模拟量Tuesday, August 31, 2021Tuesday, August 31, 2021Tuesday
杭电ACM2000-2099题的解题报告
求多源点到单终点的最短路(反向建图),ACM竞赛中应用的小程序。
基础算法类 ACM 入门 杭电OJ 11页题目题解,算法入门的时候刷题可以参考 搜集整理起来了比单个去搜题解方便快捷
杭州电子科技大学ACM Steps中Chapter One-Section One的答案集。不要直接抄哦~~ 如需题解请上我的博客~ 博客地址呈上:http://blog.csdn.net/xu_zh
示例 1:输出:[1,2,3,7,8,11,12,9,10,4,5,6]输入的多级列表如下图所示:扁平化后的链表如下图:示例 2:输出:[1,3,2]解释:输入
其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和
杭州电子科技大学ACM Steps中Chapter One-Section Two的答案集。不要直接抄哦~~ 如需题解请上我的博客~ 博客地址呈上:http://blog.csdn.net/xu_zh
示例 1:示例 2:解答:大小写转换: n = n ^ 32转小写: n = n | 32转大写: n = n & -33const toLowerCase =
2016. 增量元素之间的最大差值题目描述:给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i]
示例 2:输入:n = 10输出:37解释:第 10 天后,总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37
从第 1 秒开始,每 一秒最 开始 时,每个数据服务器都会检查它是否收到了主服务器的回复信息(包括新发出信息的回复信息):如果还没收到任何回复信息,那么该服务器