码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 691E Xor-sequences 矩阵快速幂

时间:2016-07-15 17:11:15      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

思路:刚开始 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\n",ret);
  return 0;
}
View Code

 

codeforces 691E Xor-sequences 矩阵快速幂

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5674089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!