zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【洛谷P3649】回文串
    【CH2401】送礼物
    Python 函数
    Python 文件操作
    JS的DOM和BOM
    JavaScript (内置对象及方法)
    JavaScript 基础(数据类型、函数、流程控制、对象)
    Python基础数据类型(数字、字符串、布尔、列表、元组、字典、集合等)
    MySQL(二)
    数据备份 及 Python 操作 Mysql
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5674089.html
Copyright © 2011-2022 走看看