BC #80 C Sequence(指数矩阵快速幂)
来源:互联网 发布:开淘宝店考试 编辑:程序博客网 时间:2024/04/30 09:35
题目链接:
BC #80 C Sequence
题意:
给出
分析:
对f(n)的三项因子的指数设为x,y,z构造矩阵。
| 1 B 0 | | x(n-1) | | x(n) || 0 C 1 | *| y(n-1) | = | y(n) || 0 ! 0 | | z(n-1) | | z(n) |
其中
然后用矩阵快速幂解决。因为是对指数的快速幂而且结果取模的对象是质数,所以指数取模的对象
应该是
还有一点注意:指数快速幂后还要计算正整数的快速幂即
而且两次快速幂的结果应该是相乘而不是相加!
#include <cstdio>#include <cstring>#include <cmath>#include <climits>#include <algorithm>#include <iostream>using namespace std;long long mod;struct Matrix{ int row,col; long long data[10][10];};inline Matrix Multiply(Matrix a,Matrix b){ Matrix ans; ans.row=a.row,ans.col=b.col; memset(ans.data,0,sizeof(ans.data)); for(int i=1;i<=ans.row;i++){ for(int j=1;j<=ans.col;j++){ for(int k=1;k<=a.col;k++){ //a.col==b.row ans.data[i][j]=(ans.data[i][j]+a.data[i][k]*b.data[k][j])%(mod-1); //指数取模 } } } return ans;}inline Matrix quick_power(Matrix a,long long m) //矩阵快速幂{ Matrix ans,tmp=a; ans.col=ans.row=a.row; memset(ans.data,0,sizeof(ans.data)); for(int i=1;i<=ans.row;i++) { ans.data[i][i]=1; } while(m){ if(m&1) ans=Multiply(ans,tmp); tmp=Multiply(tmp,tmp); m>>=1; } return ans;}inline long long Long_quick(long long a,long long m) //整数快速幂{ long long res=1,tmp=a; while(m){ if(m&1) res=res*tmp%mod; tmp=tmp*tmp%mod; m>>=1; } return res;}int main(){ int T; long long A,B,C,n; freopen("80Cin.txt","r",stdin); scanf("%d",&T); while(T--){ cin>>n>>A>>B>>C>>mod; long long res=Long_quick(A,B%(mod-1)); if(n==1){ printf("1\n"); continue; }else if(n==2){ printf("%lld\n",res); continue; } Matrix tmp,ans; tmp.row=tmp.col=3; tmp.data[1][1]=1,tmp.data[1][2]=B,tmp.data[1][3]=0; tmp.data[2][1]=0,tmp.data[2][2]=C,tmp.data[2][3]=1; tmp.data[3][1]=0,tmp.data[3][2]=1,tmp.data[3][3]=0; ans.row=3,ans.col=1; ans.data[1][1]=0,ans.data[2][1]=1,ans.data[3][1]=0; tmp=quick_power(tmp,n-2); ans=Multiply(tmp,ans); long long num2=Long_quick(A,ans.data[1][1]%(mod-1)); long long num1=Long_quick(res,ans.data[2][1]%(mod-1)); printf("%lld\n",(num1*num2)%mod); }}
0 0
- BC #80 C Sequence(指数矩阵快速幂)
- hdu 5667 Sequence(BC——矩阵快速幂)
- bc 29 GTY's birthday gift(矩阵快速幂)
- HDU1005 - Number Sequence (矩阵快速幂)
- HDU 5667 Sequence(矩阵快速幂)
- HDU5950Recursive sequence(矩阵快速幂)
- HDU 5667 Sequence(矩阵快速幂)
- Lucky Coins Sequence (矩阵快速幂)
- (矩阵快速幂)hdu5950 Recursive sequence
- [矩阵快速幂] CodeForces 392C Yet Another Number Sequence
- Codeforces 392-C Yet Another Number Sequence (矩阵快速幂)
- HDU 5950 Recursive sequence(矩阵构造+矩阵快速幂)
- HDU5667 Sequence(矩阵快速幂)
- 【矩阵快速幂】HDU_1005_Number Sequence
- Number Sequence 矩阵快速幂
- Codeforces 392C Yet Another Number Sequence(矩阵快速幂)
- CodeForces 392 C.Yet Another Number Sequence(矩阵快速幂)
- 2016ACM/ICPC亚洲区沈阳站 C Recursive sequence (矩阵快速幂)
- VS2015下编译安装wxWidgets环境
- 关于jdbc的数据库驱动类DriverManager.getConnection()参数
- 去沸点路上的留言板之旅
- hihocoder 数论一·Miller-Rabin质数测试
- Matlab Creo 曲线曲面协同设计(持续更新)
- BC #80 C Sequence(指数矩阵快速幂)
- 基于CentOS7开发之路 --- 第五章 :CentOS 7 安装eclipse并添加 Gnome 启动
- 专访阿里陶辉:大规模分布式系统、高性能服务器设计经验分享
- 阿里上个财年中国
- win10和linux双系统的安装
- hihocoder 数论二·Eular质数筛法
- AngularJs中promise 和 $q 的一点解释
- 第二周-Coursera/Stanford机器学习课程学习笔记-多变量线性回归
- Josephus问题