• codeforces 691E Xor-sequences 矩阵快速幂


    思路:刚开始 n个元素,a[i][j]代表以i开头,j结尾的二元组符合条件的有多少

            这是等于长度为2的数量 长度为3的数量为a*a,所以长度为n的数量是a^(k-1)

            然后就是矩阵快速幂,然而我并不能发现这道题是矩阵快速幂,没办法,太弱了

    注:这个模板是从Q神的AC代码里扒下来的,仰慕Q神

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int N = 1e2+5;
    const LL mod = 1e9+7;
    
    LL a[105],n,k; 
    struct Matrix{
      LL a[N][N];
      Matrix(){
        memset(a,0,sizeof(a));
      }
      void init(){
        for(int i=1;i<=n;++i)a[i][i]=1;
      }
      Matrix operator *(const Matrix &rhs)const{
         Matrix ret;
         for(int i=1;i<=n;++i)
          for(int j=1;j<=n;++j)
            for(int k=1;k<=n;++k)
              ret.a[i][j]=(ret.a[i][j]+a[i][k]*rhs.a[k][j]%mod)%mod;
          return ret;
      }
      Matrix operator ^(LL mi)const{
        Matrix tmp=(*this),ret;
        ret.init();
        while(mi){
          if(mi&1)ret=ret*tmp;
          tmp=tmp*tmp;
          mi>>=1;
        }
        return ret;
      }
    };
    
    int main(){
      scanf("%I64d%I64d",&n,&k);
      for(int i=1;i<=n;++i)
        scanf("%I64d",&a[i]);
      Matrix cur;
      for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j)
          if(__builtin_popcountll(a[i]^a[j])%3==0)
            ++cur.a[i][j];
      }
      cur=cur^(k-1);
      LL ret=0;
      for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
          ret=(ret+cur.a[i][j])%mod;
      printf("%I64d
    ",ret);
      return 0;
    }
    View Code
  • 相关阅读:
    数独游戏 C++ 回溯法
    DirectX 90 3D 网格一
    DirectX 90 3D SetRenderState 设置渲染状态
    DirectX90 3D 字体
    DirectX 90 3D 外接体
    VS2005下配置OGRE
    DirectX 90 3D 网格二
    Java反射机制
    UBUNTU下安装 APACHE+PHP+MYSQL文本服务器!
    关于那个SMTP类及一个例子
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5674089.html
Copyright © 2020-2023  润新知