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的个数是否是3的倍数,1表示是,0表示否。
$dp[k][i]=dp[k-1][1]*a[1][i]+...dp[k-1][n]*a[n][i]$
注意,不是$dp[k][i]=dp[k-1][1]*a[1][i]+...+dp[k-1][i-1]*a[i-1][i]$(这道题是可以重复、不按顺序选的,这么写就是不重复、按顺序)
那么,这样的算法复杂度就是O(nk),太慢了,需要优化。
从小数据开始:
n=3时: dp[1][1]=1
dp[1][2]=1
dp[1][3]=1 dp[2][1]=dp[1][1]*a[1][1]+dp[1][2]*a[2][1]+dp[1][3]*a[3][1]
dp[2][2]=dp[1][1]*a[1][2]+dp[1][2]*a[2][2]+dp[1][3]*a[3][2]
dp[2][3]=dp[1][1]*a[1][3]+dp[1][2]*a[2][3]+dp[1][3]*a[3][3] dp[3][1]=dp[2][1]*a[1][1]+dp[2][2]*a[2][1]+dp[2][3]*a[3][1]
dp[3][2]=dp[2][1]*a[1][2]+dp[2][2]*a[2][2]+dp[2][3]*a[3][2]
dp[3][3]=dp[2][1]*a[1][3]+dp[2][2]*a[2][3]+dp[2][3]*a[3][3] 很容易可以发现:
矩阵1
dp[1][1] dp[1][2] dp[1][3]
矩阵2
a[1][1] a[1][2] a[1][3]
a[2][1] a[2][2] a[2][3]
a[3][1] a[3][2] a[3][3]
矩阵1*矩阵2
dp[2][1] dp[2][2] dp[2][3]
更大的数据以此类推,因此很容易想到用矩阵快速幂优化。
而要求dp[k][],就要由dp[1][]乘k-1次矩阵2,可以改为算出来矩阵2的k-1次幂放入矩阵3,再将dp[1][]乘上矩阵3,得到的就是dp[k][]。最终答案就是dp[k][1]+..+dp[k][n]。
所以说...这个矩阵快速幂的题..居然不用自己去构造转移矩阵??
另外:
__builtin_popcountll:参照__builtin_popcount,那个是针对long整型的,这个是针对long long的
还有手动写的

#include<cstdio>
#include<cstring>
#define md 1000000007
typedef long long LL;
LL n,k,anss;
LL a[];
struct Mat
{
LL data[][],x,y;
Mat()
{
memset(data,,sizeof(data));
x=y=;
}
Mat operator*(const Mat& b)
{
Mat temp;
LL i,j,k;
for(i=;i<=x;i++)
for(j=;j<=b.y;j++)
for(k=;k<=y;k++)
temp.data[i][j]=(data[i][k]*b.data[k][j]+temp.data[i][j])%md;
temp.x=x;
temp.y=b.y;
return temp;
}
Mat& operator*=(const Mat& b)
{
return (*this)=(*this)*b;
}
Mat& operator=(const Mat& b)
{
memcpy(data,b.data,sizeof(data));
x=b.x;
y=b.y;
return *this;
}
}ma,o,bbb,ccc;
Mat pow(const Mat& a,LL b)
{
Mat ans=o;
if(b==) return ans;
Mat base=a;
while(b!=)
{
if(b&!=) ans*=base;
base*=base;
b>>=;
}
return ans;
}
int main()
{
LL i,j;
scanf("%I64d%I64d",&n,&k);
for(i=;i<=n;i++)
scanf("%I64d",&a[i]);
ma.x=ma.y=n;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
ma.data[i][j]=(__builtin_popcountll(a[i]^a[j])%==);
o.x=o.y=n;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
o.data[i][j]=(i==j);
bbb=pow(ma,k-);
ccc.x=;ccc.y=n;
for(i=;i<=n;i++)
ccc.data[][i]=;
ccc*=bbb;
for(i=;i<=n;i++)
anss=(anss+ccc.data[][i])%md;
printf("%I64d",anss);
return ;
}
Xor-sequences CodeForces - 691E || 矩阵快速幂的更多相关文章
- codeforces 691E 矩阵快速幂+dp
传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...
- Codeforces 691E题解 DP+矩阵快速幂
题面 传送门:http://codeforces.com/problemset/problem/691/E E. Xor-sequences time limit per test3 seconds ...
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. /* | 1, -1 | | fn | | 1, 0 | | f ...
- 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, ple ...
- CodeForces - 691E Xor-sequences 【矩阵快速幂】
题目链接 http://codeforces.com/problemset/problem/691/E 题意 给出一个长度为n的序列,从其中选择k个数 组成长度为k的序列,因为(k 有可能 > ...
- codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)
题目链接: B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input ...
- codeforces 691E Xor-sequences 矩阵快速幂
思路:刚开始 n个元素,a[i][j]代表以i开头,j结尾的二元组符合条件的有多少 这是等于长度为2的数量 长度为3的数量为a*a,所以长度为n的数量是a^(k-1) 然后就是矩阵快速幂,然而我并不能 ...
- CodeForces 450B Jzzhu and Sequences(矩阵快速幂)题解
思路: 之前那篇完全没想清楚,给删了,下午一上班突然想明白了. 讲一下这道题的大概思路,应该就明白矩阵快速幂是怎么回事了. 我们首先可以推导出 学过矩阵的都应该看得懂,我们把它简写成T*A(n-1)= ...
- Codeforces 691E Xor-sequences(矩阵快速幂)
You are given n integers a1, a2, ..., an. A sequence of integers x1, x2, ..., xk is called a & ...
随机推荐
- Eclipse搭建Web Service服务
1.建立动态Web工程(Dynamic Web Project),工程名为Server.编写类HelloWorld. package com.mysever; public class HelloWo ...
- 无节操cocos2d-js游戏
1. <看谁抽得快> 2. <拍苍蝇> 3. <月饼达人> 4. <亲吻小游戏> 下面这些是本人做的,需要源代码的可以回复我 ps:全部采 ...
- 中国vs美国制造业公司营业额大排名,看看哪些属于美国制造业的优势产业(中美旗鼓相当,而且还有本土制造的优势)
当然,所谓的美国制造业,大量的东西现在 在中国制造和生产,但这里列举的,主要是卖实体工业产品为主的美国公司这个榜单里主要列出以工业产品销售为主的公司. 所以各大能源巨头虽然本身也是装备制造大户,但没被 ...
- 20170301 Excel 导出函数XXL_SIMPLE_API
* XMPLT_V-COL_NO = . * XMPLT_V-COL_NAME = '物料号码'. * APPEND XMPLT_V. * * XMPLT_V-COL_NO = . * XMPLT_V ...
- HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 主线程 view
参考https://blog.csdn.net/u011001142/article/details/50912358
- 关于animate的一些属性
animate() 方法执行 CSS 属性集的自定义动画.该方法通过CSS样式将元素从一个状态改变为另一个状态.CSS属性值是逐渐改变的,这样就可以创建动画效果.只有数字值可创建动画(比如 " ...
- regmap使用介绍【转】
本文转载自:http://blog.csdn.net/hellowxwworld/article/details/10737569 内核3.1引入一套新的API regmap,目的是提取出关于I2C ...
- HDU1300 Pearls —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-1300 Pearls Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- @Data 注解在实体类的使用可省去生成GET,SET方法
你有没有觉得在每个实体类中都要生成get,set方法很麻烦, 要是需求的变化,需要再加一个字段,添加属性后则又要添加其get,set方法 现有一个很好用的注解能解决这个麻烦 1,idea中装上 lom ...