zoukankan      html  css  js  c++  java
  • 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
    ",ret);
       return 0;
    }
    View Code
  • 相关阅读:
    Nuget~打包时添加powershell初始化脚本
    ELK系列~对fluentd参数的理解
    arclistsg独立单表模型文档列表
    arcpagelistarclist列表分页
    autochannel 指定栏目
    ini文件解析c库(iniparser)
    POJ 1386 有向图欧拉通路
    最好用的20个数据可视化工具(四)
    各种语音编码总结
    struts2讲义----二
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5608670.html
Copyright © 2011-2022 走看看