codeforces 678D Iterated Linear Function 矩阵快速幂

矩阵快速幂的题要多做

由题可得 g[n]=A*g[n-1]+B

所以构造矩阵  { g[n] }    =  {A   B}  * { g[n-1]}

{   1   }         {0   1}     {    1    }

然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵

注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=5e2+5;
const int INF=0x3f3f3f3f;
const LL mod=1e9+7;
LL res[2][2],cur[2][2],a,b,n,x,tmp[2][2];
void mul(LL x[2][2],LL y[2][2])
{
  memset(tmp,0,sizeof(tmp));
  for(int i=0;i<2;++i)
    for(int j=0;j<2;++j)
      for(int k=0;k<2;++k)
         tmp[i][j]=(tmp[i][j]+x[i][k]*y[k][j]%mod)%mod;
  for(int i=0;i<2;++i)
    for(int j=0;j<2;++j)
      x[i][j]=tmp[i][j];
}
void rec_quick_mod(){
  for(int i=0;i<2;++i)
    for(int j=0;j<2;++j)
       res[i][j]=(i==j);
  while(n){
    if(n&1)mul(res,cur);
    n>>=1;
    mul(cur,cur);
  }
}
int main()
{
   scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&x);
   cur[0][0]=a;cur[0][1]=b;cur[1][0]=0;cur[1][1]=1;
   rec_quick_mod();
   LL ret=(res[0][0]*x%mod+res[0][1])%mod;
   printf("%I64d\n",ret);
   return 0;
}

时间: 2024-10-11 11:08:37

codeforces 678D Iterated Linear Function 矩阵快速幂的相关文章

hdu 6050 Funny Function 矩阵快速幂

就算告诉我是矩阵快速幂我也推不出递推式呀!!! 官方题解: 对于任意i>=1,当j>=3时,有通过归纳法可以得到 进而推导出 我构造的矩阵是(2X2) * (2X1)的 所以和官方题解的矩阵位置相反 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typ

Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

题意: 给定f1和f2,求fn 分析: 特判f1,f2 当n>=3时使用矩阵快速幂即可( 简单题 ) 将公式转化一下 , 可以得到一个变换矩阵 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MAT_SIZE 2 #define MOD 10

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

[题目链接]click here~~ [题目大意] Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo1000000007(109?+?7). [解题思路] /*A - Jzzhu and Sequences Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. 1 /* 2 | 1, -1 | | fn | 3 | 1, 0 | | fn-1 | 4 */ 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 using namespace std; 9 typedef __int64 LL; 10 LL mod =

CodeForces 185A. Plant(矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/185/A Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides int

Xor-sequences CodeForces - 691E || 矩阵快速幂

Xor-sequences CodeForces - 691E 题意:在有n个数的数列中选k个数(可以重复选,可以不按顺序)形成一个数列,使得任意相邻两个数异或的结果转换成二进制后其中1的个数是三的倍数.求可能形成的不同数列个数(只要选出的数列中,任意两个元素在原序列中的位置不同,就算作不同的序列,比如在原数列[1,1]中选1个,那么第一个1和第二个1要分开算). 方法: 很容易列出dp方程: dp[k][i]表示取了k个,最后一个在第i位.a[i][j]表示i和j异或结果转换成二进制后1的个数

[递推+矩阵快速幂]Codeforces 1117D - Magic Gems

传送门:Educational Codeforces Round 60 – D 题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem,现在需要N个gem,可以选择一定的magic gem,指定每一个分裂或不分裂,问一共有多少种方案 两种分裂方案不同当且仅当magic gem的数量不同,或者分裂的magic gem的索引不同. 思路: 1.首先从dp的角度出发 设F(i)为最终需要i个gem的方案数,容易得到递推式: (总方案数 = 最右边的m

Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)

这题想了好长时间,果断没思路..于是搜了一下题解.一看题解上的"快速幂"这俩字,不对..这仨字..犹如醍醐灌顶啊...因为x的范围是10^9,所以当时想的时候果断把dp递推这一方法抛弃了.我怎么就没想到矩阵快速幂呢.......还是太弱了..sad..100*100*100*log(10^9)的复杂度刚刚好. 于是,想到了矩阵快速幂后,一切就变得简单了.就可以把距离<=x的所有距离的点数都通过DP推出来,然后一个快速幂就解决了. 首先DP递推式很容易想到.递推代码如下: for(

Codeforces 450B div.2 Jzzhu and Sequences 矩阵快速幂or规律

Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo 1000000007 (109 + 7). Input The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single i