递推关系( Recurrences, UVa 10870)(矩阵快速幂)
来源:互联网 发布:淘宝写论文查重靠谱吗 编辑:程序博客网 时间:2024/06/15 22:26
递推关系( Recurrences, UVa 10870)
考虑线性递推关系f( n) =a
1f(n-1) +a2f(n-2) +a3f(n-3)
+…+a
df(n-d) , 最著名的例子是Fibonacci数列f(1) =f(2) =1,
f( n) =f(n-1) +f(n-2) , 因此d=2,a
1=a2=1。 你的任务是计算
f( n) 除以m的余数。
【 输入格式】
输入包含若干组数据。 每组数据第一行为3个整数d,n,
m( 1≤d≤15,1≤n≤231-1,1≤m≤46340) 。 第二行为d个非负整数a
1, a2,
…, a
d。 第三行为d个非负整数f(1) , f(2) , …,f( d) 。 这些非负整
数均不超过232-1。 输入结束标志为d=n=m=0。
【 输出格式】
对于每组数据, 输出f( n) 除以m的余数。
【 分析】
线性递推关系是组合计数中很常见的一种递推关系。 直接利用递推
式, 需要O( nd) 时间才能算出f(n) , 时间无法承受。
现在已经有了f( n) =a
1f(n-1) +a2f(n-2) +a3f(n-3) +…+
a
df(n-d) , 再加上f(n-1) =f(n-1) ,f( n-2) =f(n-2) 等显然
阵。 这正是“把一个向量变成另一个向量”。 根据矩阵乘法的定义,F( n)
=An-dF(d) 。 利用快速矩阵幂, 本题的总时间复杂度为O(d3logn) 。
程序留给读者编写。 唯一需要说明的是矩阵幂的写法。 在数论中,
幂取模都是用递归写法, 但这里推荐用迭代写法, 因为矩阵的数据量较
大, 如果递归求幂, 一不注意就会占用更多的空间, 相比之下迭代写法
考虑线性递推关系f( n) =a
1f(n-1) +a2f(n-2) +a3f(n-3)
+…+a
df(n-d) , 最著名的例子是Fibonacci数列f(1) =f(2) =1,
f( n) =f(n-1) +f(n-2) , 因此d=2,a
1=a2=1。 你的任务是计算
f( n) 除以m的余数。
【 输入格式】
输入包含若干组数据。 每组数据第一行为3个整数d,n,
m( 1≤d≤15,1≤n≤231-1,1≤m≤46340) 。 第二行为d个非负整数a
1, a2,
…, a
d。 第三行为d个非负整数f(1) , f(2) , …,f( d) 。 这些非负整
数均不超过232-1。 输入结束标志为d=n=m=0。
【 输出格式】
对于每组数据, 输出f( n) 除以m的余数。
【 分析】
线性递推关系是组合计数中很常见的一种递推关系。 直接利用递推
式, 需要O( nd) 时间才能算出f(n) , 时间无法承受。
现在已经有了f( n) =a
1f(n-1) +a2f(n-2) +a3f(n-3) +…+
a
df(n-d) , 再加上f(n-1) =f(n-1) ,f( n-2) =f(n-2) 等显然
成立的式子, 可以得到如下关系式
阵。 这正是“把一个向量变成另一个向量”。 根据矩阵乘法的定义,F( n)
=An-dF(d) 。 利用快速矩阵幂, 本题的总时间复杂度为O(d3logn) 。
程序留给读者编写。 唯一需要说明的是矩阵幂的写法。 在数论中,
幂取模都是用递归写法, 但这里推荐用迭代写法, 因为矩阵的数据量较
大, 如果递归求幂, 一不注意就会占用更多的空间, 相比之下迭代写法
更自然。
//矩阵快速幂 //和题解的差不多,但是友矩阵不是一样的//注意点就是要防溢出 #include<cstdio>#include<iostream>#include<cstring>using namespace std;long long d[20][20],dd,n,m,ans[20];void work(){n--;long long t[20],tt[20][20];while(n){if(n&1){memcpy(t,ans,sizeof(t));memset(ans,0,sizeof(ans));for(int i=1;i<=dd;i++){for(int j=1;j<=dd;j++)ans[i]=(ans[i]+d[i][j]*t[j])%m;}}n>>=1;memcpy(tt,d,sizeof(tt));memset(d,0,sizeof(d));for(int i=1;i<=dd;i++)for(int j=1;j<=dd;j++){for(int k=1;k<=dd;k++)d[i][j]+=tt[i][k]*tt[k][j];d[i][j]%=m;}}}int main(){while(~scanf("%lld%lld%lld",&dd,&n,&m)&&(dd||n||m)){memset(d,0,sizeof(d));for(int i=1;i<=dd;i++)scanf("%lld",&d[dd][dd-i+1]);int x=1,y=2;while(x<dd) d[x++][y++]=1;//友矩阵已建好for(int i=1;i<=dd;i++)scanf("%lld",ans+i);work();printf("%lld\n",ans[1]);}return 0;}
阅读全文
1 0
- 递推关系( Recurrences, UVa 10870)(矩阵快速幂)
- uva 10870 Recurrences(矩阵快速幂)
- UVA - 10870 Recurrences (矩阵快速幂)
- UVA 10870 Recurrences(矩阵快速幂)
- UVa 10870 - Recurrences (矩阵构造 矩阵快速幂)
- 矩阵快速幂(递推关系,UVA 10870)
- Uva 10870 Recurrences 解题报告(矩阵快速幂)
- uva 10870 Recurrences(数学:矩阵快速幂)
- UVA 10870 Recurrences(构造矩阵和快速幂)
- uva 10870 Recurrences(矩阵优化递推)
- UVA 10870 Recurrences 矩阵快速幂
- UVa 10870 Recurrences / 矩阵快速幂
- UVA 10870 - Recurrences(矩阵快速幂)
- uva 10870 - Recurrences(矩阵快速幂)
- UVA - 10870 Recurrences (矩阵快速幂)
- UVA - 10870 Recurrences 矩阵快速幂
- UVa - 10870 - Recurrences ( 矩阵快速幂 )
- UVa 10870 Recurrences (矩阵快速幂)
- Miller-Rabin素性测试算法详解
- .Net Core应用搭建的分布式邮件系统设计
- ireport+springMVC合并报表实例
- XUtils db学习笔记(xutils 3.5.0)
- matlab中的eig函数
- 递推关系( Recurrences, UVa 10870)(矩阵快速幂)
- 1752:鸡兔同笼(无语...)
- webapi
- Kotlin 如何去查找控件并使用
- hdu 1063 java版 精度幂
- java 将文件打成zip压缩包
- 体验node Koa2中的封装
- “LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式。”
- 31.七-执行多级目录的用例