HDU 4686 Arc of Dream 矩阵快速幂,线性同余 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=4686
当看到n为小于64位整数的数字时,就应该有个感觉,acm范畴内这应该是道矩阵快速幂
Ai,Bi的递推式题目已经给出,
Ai*Bi=Ax*Bx*(Ai-1*Bi-1)+Ax*By*Ai-1+Bx*Ay*Bi-1+Ay*By
AoD(n)=AoD(n-1)+AiBi
构造向量I{AoD(i-1),Ai*Bi,Ai,Bi,1}
初始向量为I0={0,A0*B0,A0,B0,1}
构造矩阵A{
1,0,0,0,0,
1,Ax*Bx,0,0,0,
0,Ax*By,Ax,0,0,
0,Bx*Ay,0,Bx,0,
0,Ay*By,Ay,By,1,
}
则I0*(A)^n则为包含结果的向量,此时I[0]即为解答
注意:
1.据说有n=0,直接输出0
2.long long的使用
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll n,ao,bo,ax,bx,ay,by;
void init(ll** ans,ll** base){
fill(ans[0],ans[0]+5,0);
fill(base[0],base[0]+25,0);
ans[0][1]=ao*bo%mod;
ans[0][2]=ao;
ans[0][3]=bo;
ans[0][4]=1;
base[0][0]=1;
base[1][0]=1;base[1][1]=ax*bx%mod;
base[2][1]=ax*by%mod;base[2][2]=ax;
base[3][1]=bx*ay%mod;base[3][3]=bx;
base[4][1]=ay*by%mod;base[4][2]=ay;base[4][3]=by;base[4][4]=1;
}
void print(ll **t ,int m,int r){
for(int i=0;i<m;i++){
for(int j=0;j<r;j++){
printf("%I64d ",t[i][j]);
}
puts("");
}
} void multi(ll** t,ll** b,ll ** tmp,int m,int r,int s){
fill(tmp[0],tmp[0]+m*s,0);
for(int i=0;i<m;i++){
for(int j=0;j<s;j++){
for(int k=0;k<r;k++){
tmp[i][j]+=(t[i][k]*b[k][j])%mod;
tmp[i][j]%=mod;
}
}
}
} void qpow(ll** ans,ll ** base,ll**tmp,ll time,int r,int m){
while(time>0){
if(time&1){
multi(ans,base,tmp,r,m,m);
copy(tmp[0],tmp[0]+r*m,ans[0]);
time--;
}
multi(base,base,tmp,m,m,m);
copy(tmp[0],tmp[0]+m*m,base[0]);
time>>=1;
}
} int main(){
ll ** ans = new ll*[1],**tmp=new ll*[5],** base =new ll*[5];
ans[0]=new ll[5],tmp[0]=new ll[25],base[0]=new ll[25];
for(int i=1;i<5;i++){
tmp[i]=tmp[0]+5*i;
base[i]=base[0]+5*i;
}
while(scanf("%I64d",&n)==1){
scanf("%I64d%I64d%I64d",&ao,&ax,&ay);
ao%=mod;ax%=mod;ay%=mod;
scanf("%I64d%I64d%I64d",&bo,&bx,&by);
bo%=mod;bx%=mod;by%=mod;
if(n==0)puts("0");
else {
init(ans,base);
qpow(ans,base,tmp,n,1,5);
printf("%I64d\n",ans[0][0]);
} }
delete ans;delete base;delete tmp;
return 0;
}
HDU 4686 Arc of Dream 矩阵快速幂,线性同余 难度:1的更多相关文章
- hdu 4686 Arc of Dream(矩阵快速幂)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意: 其中a0 = A0ai = ai-1*AX+AYb0 = B0bi = bi-1*BX+BY ...
- hdu 4686 Arc of Dream_矩阵快速幂
题意:略 构造出矩阵就行了 | AX 0 AXBY AXBY 0 | ...
- HDU4686 Arc of Dream 矩阵快速幂
Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- HDU4686——Arc of Dream矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4686 题目大意: 已知a0=A0, ai=Ax*ai-1+Ay; b0=B0, bi=Bx*bi-1 ...
- S - Arc of Dream 矩阵快速幂
An Arc of Dream is a curve defined by following function: where a 0 = A0 a i = a i-1*AX+AY b 0 = B0 ...
- hdu----(4686)Arc of Dream(矩阵快速幂)
Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- HDOJ 4686 Arc of Dream 矩阵高速幂
矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/ ...
- HDU 4686 Arc of Dream(矩阵)
Arc of Dream [题目链接]Arc of Dream [题目类型]矩阵 &题解: 这题你做的复杂与否很大取决于你建的矩阵是什么样的,膜一发kuangbin大神的矩阵: 还有几个坑点: ...
- HDU4686 Arc of Dream —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4686 Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memo ...
随机推荐
- Monkey Tradition---LightOj1319(中国剩余定理模板)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1319 题意:有 n 个猴子,n 棵树,树的高度为 L ,每个猴子刚开始的时候都在树的底 ...
- Python开发【数据结构】:算法(一)
算法基础 1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点: 调用自身 结束条件 两个重要递归函数的对比: # 由大到小 def func3( ...
- tomcat启动错误:ZipException
[/opt/apache-tomcat-/webapps/secsight.war] -Dec- ::] org.apache.catalina.core.ContainerBase.addChild ...
- [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答
chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...
- macOS Sierra 10.12版本 显示隐藏文件
1.显示隐藏文件 打开Terminal 输入:defaults write com.apple.finder AppleShowAllFiles -bool true 再输入: killall Fin ...
- 301-React Ext-React创建组件的三种方式及其区别
一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...
- JavaScript修改CSS属性的实例代码
用原生的javascript修改CSS属性的方法. 用JavaScript修改CSS属性 只有写原生的javascript了. 1.用JS修改标签的 class 属性值: class 属性是在标签 ...
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- 给iphone配置qq邮箱
在手机上使用qq邮箱发送和接受邮件,但是又不用qq邮箱,我用的是“网易邮箱大师” ,那么就需要配置服务. 1.在qq邮箱中设置邮箱,开启相关的服务,然后用手机发送短信来生成授权码.最后在手机上设置的密 ...
- MySQL connector c++使用笔记
MySQL的connector官方地址: http://dev.mysql.com/downloads/connector/ 针对c++来说, 可以选择c或者c++的库. c++的实现是参考了java ...