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+By;
求∑ai*bi(i=0-->n-1)。
n不超过1018,A0,Ax,Ay,B0,Bx,BY不超过2*109。
题目分析:
因为n很大,不可能用递推来做,这个时候就想到了矩阵的方法。构造了好几个满足要求的,但都是仅仅满足ai或者bi的,最后才发现,把ai*bi按递推式展开,
ai*bi=Ax*By*ai-1*bi-1+Ax*By*ai-1+Ay*Bx*bi-1+By*Ay。将常数组合在一起构成一个矩阵,将变量组合在一起构成另一个矩阵,然后将ai*bi构造成矩阵递推式:
矩阵1:
1 ai bi ai*bi si(求和)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
矩阵2:
1 Ay By Ay*By Ay*By
0 Ax 0 Ax*By Ax*By
0 0 Bx Ay*Bx Ay*Bx
0 0 0 Ax*By Ax*By
0 0 0 0 1
矩阵3
1 ai+1 bi+1 ai+1*bi+1 si(求和)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
显然 矩阵1*矩阵2=矩阵3。根据递推关系呢,矩阵1(i=0)*(矩阵2)n-1就能得到s(n-1)了。因而,用矩阵快速幂就能很快把问题解决了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long mod=;
typedef struct
{
long long m[][];
}mat;
mat X,Y;
mat multi(mat x,mat y)
{
mat temp;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
temp.m[i][j]=;
for(int k=;k<;k++)
temp.m[i][j]+=x.m[i][k]*y.m[k][j]%mod;
temp.m[i][j]%=mod;
}
return temp;
} mat pow(long long k)//矩阵快速幂
{
mat ans=X,p=Y;
while(k)
{
if(k&)
ans=multi(ans,p);
p=multi(p,p);
k/=;
}
return ans;
} int main()
{
long long n,a0,ax,ay,b0,bx,by;
while(cin>>n>>a0>>ax>>ay>>b0>>bx>>by)
{
if(!n)//这边需要注意特判一下
{
printf("0\n");
continue;
}
memset(X.m,,sizeof(X.m));
memset(Y.m,,sizeof(Y.m));
X.m[][]=;X.m[][]=a0;X.m[][]=b0;X.m[][]=a0*b0%mod;X.m[][]=a0*b0%mod;
Y.m[][]=;Y.m[][]=ay;Y.m[][]=by;Y.m[][]=ay*by%mod;Y.m[][]=ay*by%mod;
Y.m[][]=ax;Y.m[][]=Y.m[][]=ax*by%mod;
Y.m[][]=bx;Y.m[][]=Y.m[][]=ay*bx%mod;
Y.m[][]=Y.m[][]=ax*bx%mod;
Y.m[][]=;
mat ans=pow(n-);
long long s=ans.m[][]%mod;
cout<<s<<endl;
}
return ;
}
HDU4686
HDU4686——Arc of Dream矩阵快速幂的更多相关文章
- 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 —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4686 Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memo ...
- hdu----(4686)Arc of Dream(矩阵快速幂)
Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- 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(矩阵快速幂)
链接: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 矩阵快速幂,线性同余 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=4686 当看到n为小于64位整数的数字时,就应该有个感觉,acm范畴内这应该是道矩阵快速幂 Ai,Bi的递推式题目 ...
- HDOJ 4686 Arc of Dream 矩阵高速幂
矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/ ...
- HDU4686 Arc of Dream 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU4686 题意概括 a0 = A0 ai = ai-1*AX+AY b0 = B0 bi = bi-1* ...
- hdu 4686 Arc of Dream_矩阵快速幂
题意:略 构造出矩阵就行了 | AX 0 AXBY AXBY 0 | ...
随机推荐
- cookie设置今日不提醒功能
需求:为了实现 退出页面时 [启动今日不提醒]的功能.采用纯js.cookie来实现. /****今日不提醒 start *****/ var userid = <%=UserId %>; ...
- jQuery ajax 与服务器交互方法
1.HTML <table> <tr> <td>用户名:</td> <td><input type="text" ...
- Windows运行命令大全
inetmgr 启动IIS控制台winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Wi ...
- webpack快速掌握教程
转载http://yijiebuyi.com/blog/46fb97b11fb8f4055e0b04d1cecb1f69.html #为什么用webpack 如果我们 前端 javascript 能像 ...
- zoom动画,实现图片点击预览效果
参考:https://developer.android.google.cn/training/animation/zoom.html 1.创建Views 下面的布局包括了你想要zoom的大版本和小版 ...
- 不忘初心 --- 重读<<The C Programming Language>>
这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
- Ackerman 函数 (双递归函数)
public static int ackerman(int n,int m){ if(n==1&&m==0){return 2;} else if(n==0&&m ...
- 学习Sass笔记之概念篇
1 什么是CSS预处理器 首先我们了解一下什么是CSS预处理器:通俗的说,“CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件,以供项目使用.CSS 预 ...
- MySQL的loop循环函数的demo
使用的工具是Navicat for MySQL. 在MySQL中用函数实现在字符串一后面循环拼接n个字符串二 delimiter $$ drop function if exists fun_addS ...