BZOJ 3240 构造矩阵+矩阵快速幂
2024-08-31 18:44:11
思路:
ax+b cx+d
构造矩阵+矩阵快速幂
(需要加各种特判,,,,我好像加少了… )
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int mod=1000000007;
int n,m,a,b,c,d;char N[1000500],M[1000500];
struct Matrix{
int a[2][2];
void init(){memset(a,0,sizeof(a));}
friend Matrix operator*(Matrix a,Matrix b){
Matrix c;c.init();
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++){
for(int k=0;k<=1;k++)
c.a[i][j]=(a.a[i][k]*b.a[k][j]+c.a[i][j])%mod;
}
return c;
}
friend Matrix operator^(Matrix a,int b){
Matrix c;c.a[1][1]=c.a[0][0]=1,c.a[1][0]=c.a[0][1]=0;
for(;b;b>>=1,a=a*a)if(b&1)c=c*a;
return c;
}
}row,line,base,ans;
signed main(){
scanf("%s%s%lld%lld%lld%lld",N,M,&a,&b,&c,&d);
int lenn=strlen(N),lenm=strlen(M);
for(int i=0;i<lenn;i++)n=(n*10+N[i]-'0')%(mod-(a!=1));
for(int i=0;i<lenm;i++)m=(m*10+M[i]-'0')%(mod-(c!=1));
base.a[0][1]=base.a[0][0]=1;
row.a[1][1]=1,row.a[0][0]=a,row.a[1][0]=b;
line.a[1][1]=1,line.a[0][0]=c,line.a[1][0]=d;
row=row^(m-1),line=row*line;
line=line^(n-1),ans=base*line*row;
printf("%lld\n",ans.a[0][0]%mod);
}
最新文章
- linux下使用fork,exec,waitpid模拟system函数
- 删除win8的网络连接记录
- block,inline和inline-block概念和区别(转)
- iOS创建、删除文件夹、获取沙盒路径
- 十五天精通WCF——第十二天 说说wcf中的那几种序列化
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
- VPS 搭建 SS
- Groovy获取json和xml数据
- iOS第三方库-CocoaLumberjack-DDLog (转)
- ISOMAP和MDS降维
- puppeteer端对端测试demo
- Keepalived+LVS-DR+Nginx高可用故障切换模式
- Practical Web Penettation Testing (the first one Mutillidae 大黄蜂)
- 22状态模式State
- Jquery EasyUI Combotree根据选中的值展开所有父节点
- 22.LinkedList
- 修改select样式
- ArrayBlcokingQueue,LinkedBlockingQueue与Disruptor三种队列对比与分析
- 使用云负载时将http的请求转发至https时报错:“ERR_TOO_MANY_REDIRECTS”!
- [Node.js]24. Level 5: Express, Express routes