题目链接;
HDU 3221 Brute-force Algorithm
题意:
根据递归可以得到f[1]=a,f[2]=b,f[n]=f[n−1]∗f[n−2](n≥3)f[1]=a, f[2]=b,f[n]=f[n-1]*f[n-2](n\geq 3),给出a,b,p,na,b,p,n求f[n]%p的值。f[n]\% p的值。
数据范围:1≤n≤1000000000,1≤P≤1000000,0≤a,b<1000000.1≤n≤1000000000, 1≤P≤1000000, 0≤a, b
分析:
设菲波那切数列第nn项为g[n],g[1]=0,g[2]=1,g[3]=1.g[n],g[1]=0,g[2]=1,g[3]=1.根据递推可以得到:
f[n]=ag(n−1)∗bg(n) %p  (n≥3)f[n]=a^{g(n-1)}*b^{g(n)} \ \% p\ \ (n\geq 3)
但是考虑到指数g(n)g(n)会很大,我们需要降幂。
指数降幂公式:

Ax % p=Ax%ϕ(p)+ϕ(p) % p (x≥ϕ(p),ϕ(p)是p的欧拉函数值)

A^{x}\ \% \ p=A^{x\%\phi(p)+\phi(p)}\ \% \ p\ (x\geq \phi(p),\phi(p)是p的欧拉函数值)
所以用矩阵快速幂求菲波那切数列时的取模数是 ϕ(p)\phi (p)而不是 pp。

下面的代码用G++G++提交能 ACAC,用 C++C++就不能。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#include <bitset>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
const int SIZE = 10;
const int MAX_N = 1000010;bitset<MAX_N> bs;
int prime_cnt, prime[MAX_N], phi[MAX_N];struct Matrix {int row, col;ll data[SIZE][SIZE];Matrix () {}Matrix (int _row, int _col): row(_row), col(_col) {}
};void GetPhi()
{bs.set();prime_cnt = 0;phi[1] = 1;for(int i = 2; i < MAX_N; ++i) {if(bs[i] == 1) {prime[prime_cnt++] = i;phi[i] = i - 1;}for(int j = 0; j < prime_cnt && i * prime[j] < MAX_N; ++j) {bs[i * prime[j]] = 0;if(i % prime[j]) {phi[i * prime[j]] = (prime[j] - 1) * phi[i];}else {phi[i * prime[j]] = prime[j] * phi[i];break;}}}
}Matrix matrix_mul(Matrix a, Matrix b, ll p)
{Matrix res;memset(res.data, 0, sizeof(res.data));res.row = a.row, res.col = b.col;for(int i = 1; i <= res.row; ++i) {for(int j = 1; j <= res.col; ++j) {for(int k = 1; k <= a.col; ++k) {res.data[i][j] += a.data[i][k] * b.data[k][j];if(res.data[i][j] > p) res.data[i][j] = (res.data[i][j] % p + p);}}}return res;
}Matrix matrix_quick_pow(Matrix a, ll b, ll p)
{Matrix res, tmp = a;memset(res.data, 0, sizeof(res));res.row = res.col = a.row;for(int i = 1; i <= res.row; ++i) { res.data[i][i] = 1; }while(b) {if(b & 1) res = matrix_mul(res, tmp, p);tmp = matrix_mul(tmp, tmp, p);b >>= 1;}return res;
}ll quick_pow(ll a, ll b, ll c)
{ll res = 1, tmp = a % c;while(b) {if(b & 1) res = res * tmp % c;tmp = tmp * tmp % c;b >>= 1;}return res;
}int main()
{GetPhi();int T, cases = 0;ll a, b, p, n;scanf("%d", &T); while(T--) {scanf("%lld%lld%lld%lld", &a, &b, &p, &n);if(n == 1) {printf("Case #%d: %lld\n", ++cases, a % p);continue;} else if(n == 2) {printf("Case #%d: %lld\n", ++cases, b % p);continue;} else if(n == 3) {printf("Case #%d: %lld\n", ++cases, a * b % p);continue;} else if(a == 0 || b == 0 || p == 1) {printf("Case #%d: %d\n", ++cases, 0);continue;}Matrix res, tmp;tmp.row = tmp.col = 2;tmp.data[1][1] = 0, tmp.data[1][2] = 1;tmp.data[2][1] = 1, tmp.data[2][2] = 1;res.row = 2, res.col = 1;res.data[1][1] = 0, res.data[2][1] = 1;tmp = matrix_quick_pow(tmp, n - 2, phi[p]);res = matrix_mul(tmp, res, phi[p]);ll ans = quick_pow(a, res.data[1][1], p);ans = ans * quick_pow(b, res.data[2][1], p) % p;printf("Case #%d: %lld\n", ++cases, ans);}return 0;
}

HDU 3221 Brute-force Algorithm(指数降幂公式)相关推荐

  1. 计蒜客 17414 Exponial 指数降幂公式

    链接: https://nanti.jisuanke.com/t/17414 题意: 求f(n) = n ^ f(n-1) % m 题解: 指数降幂公式 代码: 31 ll n, m; 32 33 l ...

  2. Brute force and exhaustive search

    Brute force and exhaustive search(蛮力和彻底搜索) Brute force is a straightforward approach to solving a pr ...

  3. hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)

    Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...

  4. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)

    暴力分为两种,一种属于毫无人性的暴力,一种属于有人性 的暴力.前面一种就不说了,对于后面一种情况,我们可以只对其中的部分问题进行枚举,而通过这些子问题而推导到整个的问题中.我称之为有人性的Brute ...

  5. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  6. Summer Training day4上帝与集合的正确用法 欧拉函数+降幂公式

    这个题的指数太大了,因此要考虑用降幂公式进行降幂 记f(p) = 2^2^2... % p f(p) = 2^(2^2^2...%phi(p) + phi(p)) % p = 2^(f(phi(p)) ...

  7. MATLAB中能对三角函数降幂嘛,初中数学三角函数降幂公式

    三角函数降幂公式是三角函数常用公式,下面总结了初中三角函数降幂公式,但愿能辅佐到各人. 三角函数降幂公式 三角函数的降幂公式是:cos²α = (1+ cos2α) / 2 sin²α=(1-cos2 ...

  8. 逆元,欧拉降幂公式,二次剩余

    一.逆元 概念和作用 逆元其实跟倒数很相似. 逆元概念:方程 a x ≡ 1 ( m o d p ) ax\equiv 1(mod\, \: p) ax≡1(modp) 的解称为 a 关于模 p 的逆 ...

  9. POJ2720_Last Digits_欧拉降幂公式打表

    题意 定义函数 f(x) = b^f(x-1) if x > 0, and f(0)=1.(a^b表示a的b次幂) 给定 b, i, n,求f(i) 的末n位 思路 首先末 n 位的意思就是 m ...

  10. Unit 2: Password Cracking 2.1 Password Cracking Brute Force Attacks

    >> In a future unit, we'll learn how attackers can get possession of a database containing has ...

最新文章

  1. 单片机从事什么工作?只会51单片机能找到工作吗?
  2. css表格文字超数量就竖排_绝了,超轻量级中文 OCR,你值得拥有
  3. python学习与数据挖掘_Python学习之数据挖掘(三)
  4. PCA对特征点描述子降维
  5. 漫步线性代数十六——投影和最小二乘
  6. c++ to_string 指定字符位数_Java 字符串拼接,去首尾, 判空, 类型转换
  7. java h5服务器推送事件_关于H5+中push推送的服务端代码是怎么写的
  8. Codeforces Round #161 (Div. 2) B. Squares
  9. Mac 选项列如何设置控制中心?
  10. JAVA minaio模型_Mina的线程模型
  11. 小甲鱼Python学习
  12. 【UCOSIII操作系统】软件定时器篇
  13. 方德系统服务器,国产方德桌面操作系统介绍
  14. docker端口映射后连不上的问题
  15. 中国多媒体与网络教学学报杂志中国多媒体与网络教学学报杂志社中国多媒体与网络教学学报编辑部2022年第6期目录
  16. 5款优秀的在线表格生成工具
  17. libxml2生成,解析,修改xml文件,以及使用实例
  18. 传统OA厂商举步维艰
  19. BFF——服务于前端的后端
  20. 三维地图之cesium加载天地图(有代码)

热门文章

  1. android编程播放音乐,Android编程实现播放音频的方法示例
  2. 为什么编c语言总有一个错误,为什么程序最后总会显示有1个错误
  3. dependency check工具的使用
  4. 《Docker从入门到实践》
  5. 未能加载文件或程序集“Microsoft.Web.Infrastructure”
  6. [MvcCore]记录部署好的应用程序突然无法访问的一次蹩脚经历!
  7. 主播名字和热度的字符串该怎么写啊,他们两个量前面的字符一样
  8. C++数据采集软件和数据显示软件(TCP通信)
  9. 计算机无法联网 如何解决,电脑无法连接网络或不能正常上网的解决方法
  10. Windows中Python3.x下运行Python2.x程序解决方案