[LightOJ1070]Algebraic Problem

Posted hjj1871984569

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LightOJ1070]Algebraic Problem相关的知识,希望对你有一定的参考价值。

题目:Algebraic Problem

链接:https://vjudge.net/problem/LightOJ-1070

分析:

1)$ a^n+b^n = ( a^{n-1}+b^{n-1} )*(a+b) - (a*b^{n-1}+a^{n-1}*b) $

构造矩阵: $ left[ egin{array}{cc} 0 & -1 \ a*b & a+b end{array} ight] $

$$ left[ egin{array}{cc} a*b^{n-1}+a^{n-1}*b  &   a^{n-1}+b^{n-1} end{array} ight]  *  left[ egin{array}{cc} 0 & -1 \ a*b & a+b end{array} ight]  = left[ egin{array}{cc} a*b^n+a^n*b  &   a^n+b^n end{array} ight] $$

2)注意特判0的情况,至于对$2^{64}$取模,开unsigned long long,自然溢出即可。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 typedef unsigned long long LLU;
 5 typedef unsigned int uint;
 6 struct Matrix{
 7     LLU a[2][2];
 8     Matrix(int f=0){
 9         memset(a,0,sizeof a);
10         if(f==1)for(int i=0;i<2;++i)a[i][i]=1;
11     }
12 };
13 Matrix operator*(Matrix& A,Matrix& B){
14     Matrix C;
15     for(int k=0;k<2;++k)
16         for(int i=0;i<2;++i)
17         for(int j=0;j<2;++j)
18             C.a[i][j]+=A.a[i][k]*B.a[k][j];
19     return C;
20 }
21 Matrix operator^(Matrix A,uint n){
22     Matrix Rt(1);
23     for(;n;n>>=1){
24         if(n&1)Rt=Rt*A;
25         A=A*A;
26     }
27     return Rt;
28 }
29 int main(){
30     int T;scanf("%d",&T);
31     Matrix A,ANS;LLU p,q;uint n;
32     for(int i=1;i<=T;++i){
33         scanf("%llu%llu%u",&p,&q,&n);
34         if(n==0){
35             printf("Case %d: 2
",i);
36             continue;
37         }
38         A.a[0][0]=0;A.a[0][1]=-1;
39         A.a[1][0]=q;A.a[1][1]=p;
40         ANS=A^(n-1);
41         LLU ans=2*q*ANS.a[0][1]+ANS.a[1][1]*p;
42         printf("Case %d: %llu
",i,ans);
43     }
44     return 0;
45 }
46         

 

3)$ a^n + b^n = (a^{n-1}+b^{n-1})*(a+b) - (a*b^{n-1}+a^{n-1}*b) = (a^{n-1}+b^{n-1})*(a+b)-a*b*(b^{n-2}+a^{n-2}) $

构造矩阵:$ left[ egin{array}{cc} a+b & -ab \ 1 & 0 end{array} ight] $

$$ left[ egin{array}{cc} a+b & -ab \ 1 & 0 end{array} ight] *  left[ egin{array}{c} a^{n-1}+b^{n-1}   \   a^{n-2}+b^{n-2} end{array} ight]  = left[ egin{array}{c} a^n+b^n \   a^{n-1}+b^{n-1} end{array} ight] $$

以上是关于[LightOJ1070]Algebraic Problem的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ 1070 - Algebraic Problem 推导+矩阵快速幂

lightoj1070

矩阵专题

Algebraic Data Type 及其在 Haskell 和 Scala 中的表现

量子密码学攻击——Improved Dual Lattice Attack

deepfacelab用1070还是1080