首先是题目链接
现场思路
首先...
我们有矩阵快乘的方式可以O(logn)求出Fib[n]%mod
我的实现略有不同,本质一样
矩阵乘法之中会出现Ω(10^18)*Ω(10^18)%Ω(10^18)
直接乘法错误(比如 a=10^18-3,b=10^18-2,c=10^18-1,a*b%c直接写在程序里面导致结果错误)
http://lx.lanqiao.org/problem.page?gpid=T121
如有错误,欢迎指出,讨论~
蓝桥杯里面的数据相当水...很容易就能够水过去现场思路
首先...
我们有矩阵快乘的方式可以O(logn)求出Fib[n]%mod
我的实现略有不同,本质一样
矩阵乘法之中会出现Ω(10^18)*Ω(10^18)%Ω(10^18)
直接乘法错误(比如 a=10^18-3,b=10^18-2,c=10^18-1,a*b%c直接写在程序里面导致结果错误)
这里需要用类似快速幂的做法
LL llmul( LL a,LL b,LL mod ) {
a%=mod;a+=mod;a%=mod;
b%=mod;b+=mod;b%=mod;
if ( a<b )swap( a,b );
LL ret=0;
while ( b ) {
if ( b&1 )ret=( ret+a )%mod;
a=( a<<1 )%mod;
b/=2;
}
return ret;
}
矩阵快速幂和这个的写法一样
这是解决Fib[n]%mod的函数们
struct matrix {
LL x[3][3];
matrix() {memset( x,0,sizeof x );}
};
matrix mmul( matrix &A,matrix &B,LL mod ) {
matrix ret;
for ( int i=1; i<=2; i++ )for ( int j=1; j<=2; j++ )for ( int k=1; k<=2; k++ )
ret.x[i][j]=( ret.x[i][j]+llmul( A.x