ahu 395 快速矩阵幂初学 + 矩阵快速幂模板
来源:互联网 发布:搜索引擎怎么数据分析 编辑:程序博客网 时间:2024/05/21 22:34
#include <cstdio>#include <string>#include <cmath>#include <iostream>using namespace std;const long long M = 10003;const long long N = 3;long long t,b,c=0,f1,f2;struct Node //矩阵{ long long line,cal; long long a[N+1][N+1]; Node(){ line=3,cal=3; a[0][0] = b; a[0][1] = 1; a[0][2] = 0; a[1][0] = t; a[1][1] = 0; a[1][2] = 0; a[2][0] = c; a[2][1] = 0; a[2][2] = 1; }};Node isit(Node x,long long c) //矩阵初始化{ for(long long i=0;i<N;i++) for(long long j=0;j<N;j++) x.a[i][j]=c; return x;}Node Matlab(Node x,Node s) //矩阵乘法{ Node ans; ans.line = x.line,ans.cal = s.cal; ans=isit(ans,0); for(long long i=0;i<x.line;i++) { for(long long j=0;j<x.cal;j++) { for(long long k=0;k<s.cal;k++) { ans.a[i][j] += x.a[i][k]*s.a[k][j]; ans.a[i][j]=(ans.a[i][j]+M)%M; } } } return ans;}long long Fast_Matrax(long long n) //矩阵快速幂{ if(n==1) return f1; n-=2; long long x=1,f=n,ok=1; Node ans,tmp,ch; ans.line = 1,ans.cal = 3; ans.a[0][0] = f2, ans.a[0][1] = f1 ,ans.a[0][2] = 1; while(n>0) { if(n%2) { ans=Matlab(ans,tmp); } tmp=Matlab(tmp,tmp); n/=2; } return ans.a[0][0];}int main(){ long long n,T; while(1) { scanf("%lld%lld%lld%lld%lld",&f1,&f2,&b,&t,&n); if(f1==0&&f2==0&&b==0&&t==0&&n==0)break; printf("%lld\n",Fast_Matrax(n)); } return 0;}
//模板int n,k,b,mod = 2;char c[500];//快速幂struct ma{ int m[115][115],row,col; ma() { memset(m,0,sizeof(m)); row = col = 0; } ma operator * (ma ma1) //乘 { ma ans; ans.row = row; ans.col = ma1.col; for(int i = 1;i <= ans.row;i++) for(int j = 1;j <= ans.col;j++) { for(int k = 1;k <= col;k++) { ans.m[i][j] += (m[i][k] * ma1.m[k][j]); } ans.m[i][j] %= mod; } return ans; } ma operator + (ma ma1) //加 { ma ans; ans.row = row; ans.col = col; for(int i = 1;i <= row;i++) for(int j = 1;j <= col;j++) { ans.m[i][j] = ma1.m[i][j] + m[i][j]; ans.m[i][j] %= mod; } return ans; } ma operator^(int n) // 快速幂 { ma ans,ma1; ans.row = row; ans.col = col; for(int i = 1;i <= row;i++) ans.m[i][i] = 1; ma1.row = row; ma1.col = col; for(int i = 1;i <= row;i++) for(int j = 1;j <= col;j++) ma1.m[i][j] = m[i][j]; while(n) { if(n&1)ans = ans * ma1; ma1 = ma1 * ma1; n >>= 1; } return ans; } void debug() { for(int i = 1;i <= row;i++) { for(int j = 1;j <= col;j++) printf("%d ",m[i][j]); printf("\n"); } }};
0 0
- ahu 395 快速矩阵幂初学 + 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂--模板
- 矩阵快速幂 模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 【矩阵快速幂模板】
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂【模板】
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵快速幂 【模板】
- 欢迎使用CSDN-markdown编辑器
- 加密解密数字证书相关知识
- SQL扩展之T-SQL中的数据查询语言之选择查询篇
- django 1.8 官方文档翻译:13-1-3 密码管理
- 周末总结
- ahu 395 快速矩阵幂初学 + 矩阵快速幂模板
- hdu 1163 免费的馅饼
- EPIGRAMS IN PROGRAMMING
- 数据库的增删改查
- poj-2406-Power Strings(KMP)
- Android Studio + gradle + Androidannotations 配置记录
- Eclipse 批量格式化的功能
- java__基础复习02
- netbeans的界面跳转和测试点