bzoj3240: [Noi2013]矩阵游戏
2016-03-19 16:45
411 查看
看题目名:矩阵乘法。。。
有公式:x^a=x^(a%phi(p)+phi(p)) (mod p)
因为np,mp互质,可令n=n%phi(p),m=m%(phi(p)).
同一行内可构造矩阵A,设F[i][1]*A'=F[i][m]。
行末到下一行首可构造矩阵B,F[i][1]*B'=F[i+1][1]。
可求得Ans。
有公式:x^a=x^(a%phi(p)+phi(p)) (mod p)
因为np,mp互质,可令n=n%phi(p),m=m%(phi(p)).
同一行内可构造矩阵A,设F[i][1]*A'=F[i][m]。
行末到下一行首可构造矩阵B,F[i][1]*B'=F[i+1][1]。
可求得Ans。
#include<iostream> #include<cstdio> #include<cstring> #define mo 1000000007 #define ll long long using namespace std; ll n,m,a,b,c,d,phi,l;char c1[1000005],c2[1000005]; struct Matrix{ll M[2][2];}A,B,f; Matrix operator*(Matrix a,Matrix b) { Matrix ans; for (int i=0;i<2;i++) for (int j=0;j<2;j++) { ans.M[i][j]=0; for (int k=0;k<2;k++) ans.M[i][j]+=a.M[i][k]*b.M[k][j]; ans.M[i][j]%=mo; } return ans; } Matrix pow(Matrix a,ll k) { Matrix ans; ans.M[0][0]=ans.M[1][1]=1; ans.M[0][1]=ans.M[1][0]=0; for (;k;k>>=1,a=a*a) if (k&1) ans=ans*a; return ans; } int main() { scanf("%s%s",c1,c2); scanf("%lld%lld%lld%lld",&a,&b,&c,&d); phi=mo-1; if (a==1&&c==1)phi++; l=strlen(c1); for (ll i=0;i<l;i++) n=(n*10+c1[i]-'0')%phi; l=strlen(c2); for (ll i=0;i<l;i++) m=(m*10+c2[i]-'0')%phi; A.M[0][0]=1;A.M[0][1]=b; A.M[1][0]=0;A.M[1][1]=a; B.M[0][0]=1;B.M[0][1]=d; B.M[1][0]=0;B.M[1][1]=c; f.M[0][0]=f.M[0][1]=1; A=pow(A,m-1);B=A*B;B=pow(B,n-1); printf("%lld\n",(f*B*A).M[0][1]); }
相关文章推荐
- tableViewCell 自适应行高的坑
- uva 489 Hangman Judge
- 第37讲项目2——乘法口诀表
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
- Android日期相关函数的工具类
- 前端题目
- 七、Android动画
- 52.iOS9 适配教程
- JavaScript 匿名函数、模块模式、闭包、命名空间、创建构造器(类)、继承
- bzoj2152: 聪聪可可
- (9)Map按键和按键值排序
- Nexus4铃声目录
- php 基础
- 数据结构与算法-第12章二叉树和其他树-003求二叉树的高度
- 大道至简阅读笔记03
- 1008-移动距离
- FZU1894 志愿者选拔
- csv导入sqlsever脚本
- nyoj--1058 部分和问题(dfs)
- 第一个Hadoop程序WordCount