链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686

题意:

其中a0 = A0
ai = ai-1*AX+AY
b0 = B0
bi = bi-1*BX+BY

最后的结果mod 1,000,000,007

n<=10^18.

分析:ai*bi=(ai-1 *ax+ay)*(bi-1 *bx+by)

=(ai-1 * bi-1 *ax*bx)+(ai-1 *ax*by)+(bi-1 *bx*ay)+(ay*by)

设p=ax*bx,  q=ax*by,  r=ay*bx,  s=ay*by

所以ai*bi=p(ai-1 * bi-1)+q(ai-1)+r(bi-1)+s

虽然可以用递推来求出每一项,但是n太大了,直接求绝对会超时的。

设f(n)=an*bn,  a(n)=an,  b(n)=bn

s(n)=sum(ai*bi),i=0,1,...n

则f(i)=p*f(i-1)+q*a(i-1)+r*b(i-1)+s

这是一个递推式,对于任何一个递推式,我们都可以用矩阵法来优化,加快速度求出第n项或前n项和。

我们可以构造一个5*5的矩阵A,使得

【f(n-1),a(n-1),b(n-1),1,s(n-2)】*A=【f(n),a(n),b(n),1,s(n-1)】

=【p*f(n-1)+q*a(n-1)+r*b(n-1)+s, a(n-1)*ax+ay, b(n-1)*bx+by, 1, s(n-2)+f(n-1)】

所以我们容易得出矩阵A: 【   axbx    0   0   0   1

axby   ax   0   0   0

aybx    0   bx  0   0

ayay   ay  by   1   0

0         0    0    0   1 】

由【f(1), a(1) ,b(1), 1, s(0)】*A = 【f(2), a(2), b(2), 1, s(1)】

以此类推得,【f(1), a(1) ,b(1), 1, s(0)】*A^(n-1) = 【f(n), a(n), b(n), 1, s(n-1)】

这样就可以快速的求出s(n-1)了,

其中f(1)=a1*b1, a(1)=a0*ax+ay,

b(1)=b0*bx+by, s(0)=a0*b0

接下来就是矩阵快速幂了。

注意:n==0时,直接输出0,不然会死循环TLE的,还有就是要用long long,也要记得mod

AC代码如下:

 #include<stdio.h>
#include<string.h>
//#define LL __int64
#define LL long long
#define M 1000000007
struct Matrix
{
LL a[][];
}origin,res,tmp,A,ans;
int n;
Matrix mul(Matrix x,Matrix y)
{
int i,j,k;
memset(tmp.a,,sizeof(tmp.a));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(k=;k<=n;k++)
{
tmp.a[i][j]+=(x.a[i][k]*y.a[k][j])%M;
tmp.a[i][j]%=M;
}
return tmp;
}
void quickpow(LL k)
{
int i;
memset(res.a,,sizeof(res.a));
for(i=;i<=n;i++)
res.a[i][i]=;
while(k)
{
if(k&)
res=mul(res,A);
A=mul(A,A);
k>>=;
}
}
int main()
{
LL N,a0,ax,ay,b0,bx,by;
LL f1,a1,b1,s0;
// while(scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d",&N,&a0,&ax,&ay,&b0,&bx,&by)!=EOF)
while(scanf("%lld %lld %lld %lld %lld %lld %lld",&N,&a0,&ax,&ay,&b0,&bx,&by)!=EOF)
{
if(N==)
{
printf("0\n");
continue;
}
a1=(a0*ax+ay)%M;
b1=(b0*bx+by)%M;
f1=(a1*b1)%M;
s0=(a0*b0)%M;
n=;
memset(origin.a,,sizeof(origin.a));
origin.a[][]=f1;
origin.a[][]=a1;
origin.a[][]=b1;
origin.a[][]=;
origin.a[][]=s0;
memset(A.a,,sizeof(A.a));
A.a[][]=(ax*bx)%M;
A.a[][]=;
A.a[][]=(ax*by)%M;
A.a[][]=ax%M;
A.a[][]=(ay*bx)%M;
A.a[][]=bx%M;
A.a[][]=(ay*by)%M;
A.a[][]=ay%M;
A.a[][]=by%M;
A.a[][]=;
A.a[][]=; quickpow(N-);
ans=mul(origin,res);
// printf("%I64d\n",ans.a[1][5]);
printf("%lld\n",ans.a[][]);
}
return ;
}

hdu 4686 Arc of Dream(矩阵快速幂)的更多相关文章

  1. HDU 4686 Arc of Dream 矩阵快速幂,线性同余 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=4686 当看到n为小于64位整数的数字时,就应该有个感觉,acm范畴内这应该是道矩阵快速幂 Ai,Bi的递推式题目 ...

  2. hdu 4686 Arc of Dream_矩阵快速幂

    题意:略 构造出矩阵就行了 |   AX   0    AXBY   AXBY       0  |                                                   ...

  3. HDU4686 Arc of Dream 矩阵快速幂

    Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  4. 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 ...

  5. 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  ...

  6. hdu----(4686)Arc of Dream(矩阵快速幂)

    Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  7. HDOJ 4686 Arc of Dream 矩阵高速幂

    矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/ ...

  8. HDU 4686 Arc of Dream(矩阵)

    Arc of Dream [题目链接]Arc of Dream [题目类型]矩阵 &题解: 这题你做的复杂与否很大取决于你建的矩阵是什么样的,膜一发kuangbin大神的矩阵: 还有几个坑点: ...

  9. HDU4686 Arc of Dream —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4686 Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memo ...

随机推荐

  1. REST API 开发

    本文我们将使用Spring MVC 4实现 CRUD Restful WebService , 通过RestTemplate写一个 REST 客户端,定义这些服务. 我们也可以通过外部的一些客户端来测 ...

  2. P2154 [SDOI2009]虔诚的墓主人

    略有一点点思维的题. 首先,如果一个点上,下,左,右分别有\(a,b,c,d\)棵树,那这个点的十字架方案为\(C_{a}^{k}C_{b}^{k}C_{c}^{k}C_{d}^{k}\). 按x坐标 ...

  3. LOJ #6089. 小 Y 的背包计数问题

    LOJ #6089. 小 Y 的背包计数问题 神仙题啊orz. 首先把数分成\(<=\sqrt n\)的和\(>\sqrt n\)的两部分. \(>\sqrt n\)的部分因为最多选 ...

  4. JZOJ5371 组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({ ...

  5. 【TestNG测试】TestNG、Maven、testng.xml构建测试工程

    创建一个maven工程 使用Idea创建maven工程 ​ 建立类似如上的工程结构,src/main/java,src/test/java,pom.xml,testng.xml,这里由于我们使用工程是 ...

  6. JAVA枚举操作(获取值,转map集合)

    JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中 ...

  7. log4cpp简单使用及踩到的坑

    log4cpp是log4j的一个扩展, C++开发者可用该库记录日志,可输出到终端,亦可保存到文件. 下面简单demo展示如何输出日志到输出终端. #include <iostream> ...

  8. 32bit 天堂2服务端多机负载

    第一步..先确定..单机架设成功.. 第二步..复制整个服务器端文件到第2个服务器 第3步.. 将你C:\Program Files\Common Files\ODBC\Data Sources 中的 ...

  9. Vuejs 使用 lib 库模式打包 umd 解决 NPM 包发布的问题

    由于升级了 v0.2 版 GearCase 使用打包工具从 parcel 更换成 vue-cli 3.x.因此打包后发布 NPM 包的方式与之前有很大的差异,这也导致了在发布完 GearCase v0 ...

  10. 关于jQuery Form Plugin使用心得

    吐槽一下先 好久没开发了,今天遇到一个客户form提交的问题,想把form提交从同步变成ajax的异步方式,在网页接受返回来的数据,使用的是jquery from插件,于是网上搜了一圈,博客园,csd ...