题目链接:点击查看

题目大意:给出两种型号的瓷砖,尺寸分别是 a∗1a*1a∗1 和 b∗1b*1b∗1,现在需要填满 w∗hw*hw∗h 的矩阵,需要满足以下两个情况:

  1. 瓷砖不能旋转
  2. 相邻的两行中,前缀和不能有交集

问方案数

题目分析:因为 a,b,wa,b,wa,b,w 都特别小,按照题目要求爆搜以下不难看出,每一行最多有 114114114 种方案

对于相邻的两行是否可以放置,我们可以维护一个可行矩阵 mazei,jmaze_{i,j}mazei,j​,mazei,j=1maze_{i,j}=1mazei,j​=1 代表第 iii 种方案可以和第 jjj 种方案相邻,这个可以在时间复杂度 O(n2∗w)O(n^2*w)O(n2∗w) 的复杂度下预处理出来,因为时间复杂度还有冗余,所以我还加了个 setsetset 降低了代码复杂度

那么现在问题转换为:选择任意起点,走 hhh 步后,不同的方案数有多少

矩阵快速幂的模板题,套上模板就好了

代码:

// Problem: Little Witch Academia
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/17574/L
// Memory Limit: 524288 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
const int mat_size = 150;//矩阵大小,需要乘以2,为了&运算的时候需要二倍的矩阵大小
const int mod=1e9+7;
struct Matrix
{long long a[mat_size][mat_size];int x, y;//长宽Matrix()  //返回0矩阵{memset(a,0,sizeof(a));}Matrix(int x,int y)//返回0矩阵,并且x,y赋值{this->x = x;this->y = y;memset(a, 0,sizeof(a));}Matrix(int n)  //返回n*n的【单位矩阵】{this->x=n;this->y=n;memset(a,0,sizeof(a));for (int i = 0; i <n;++i)    a[i][i]=1;}Matrix operator * (const Matrix &B)//矩阵乘法{Matrix tmp;for (int i = 0; i < x; ++ i)for (int j = 0; j < B.y; ++ j){tmp.a[i][j] = 0;for (int k = 0; k < y; ++ k){tmp.a[i][j] = (tmp.a[i][j] + a[i][k] * B.a[k][j] % mod) % mod;}}tmp.x = x;tmp.y=B.y;return tmp;}Matrix operator ^ (long long b)//矩阵A的b次方{Matrix ret = Matrix(x);  Matrix A = *this;while( b )  {  if( b & 1 ) ret = ret * A ;  b >>= 1 ;  A = A * A ;  }  return ret ;  }Matrix operator & (int b)//A^0 + A^1+A^2+A^3+++A^n,其中A是矩阵。最后返回的就是一个矩阵{Matrix ret = *this;for (int i = ret.x; i < ret.x * 2; ++ i)   {ret.a[i-ret.x][i]= 1;ret.a[i][i] = 1;}ret.x <<= 1;ret.y <<= 1;//pg(ret);ret = ret^b;ret.x >>= 1;ret.y >>= 1;for (int i = 0; i < ret.x; ++ i)  for (int j = 0; j < ret.y; ++ j)(ret.a[i][j] += ret.a[i][j + ret.x])%=mod;return ret;}void pg(Matrix A){for (int i = 0; i <A.x; ++i){for (int j = 0; j < A.y;++j) cout<<A.a[i][j]<<" ";cout<<endl;}cout<<endl;}
}maze;
int a,b,w,h;
vector<int>tmp;
vector<vector<int>>node;
void dfs(int cur) {if(cur>w) {return;}if(cur==w) {node.push_back(tmp);return;}tmp.push_back(a);dfs(cur+a);tmp.pop_back();tmp.push_back(b);dfs(cur+b);tmp.pop_back();
}
bool check(vector<int>a,vector<int>b) {set<int>st;int sum=0;for(auto it:a) {sum+=it;st.insert(sum);}sum=0;for(auto it:b) {sum+=it;if(sum!=w&&st.count(sum)) {return false;}}return true;
}
void build() {maze=Matrix(node.size(),node.size());for(int i=0;i<(int)node.size();i++) {for(int j=0;j<(int)node.size();j++) {maze.a[i][j]=check(node[i],node[j]);}}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int t;cin>>t;while(t--) {node.clear();tmp.clear();read(a),read(b),read(w),read(h);dfs(0);build();maze=maze^(h-1);LL ans=0;for(int i=0;i<maze.x;i++) {for(int j=0;j<maze.y;j++) {ans=(ans+maze.a[i][j])%mod;}}cout<<ans<<endl;}return 0;
}

上海理工大学第二届“联想杯”全国程序设计邀请赛 - Little Witch Academia(矩阵快速幂)相关推荐

  1. 上海理工大学第二届“联想杯”全国程序设计邀请赛

    文章目录 上海理工大学第二届"联想杯"全国程序设计邀请赛 A.A-SOUL! B.Bheith i ngra le C.Counting Cats! D.Dahno Dahno E ...

  2. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)

    题目链接:点击查看 题目大意:在二维平面的第一象限中给出两条射线代表河流,再给出起点和终点,问从起点出发,至少经过两条河各一次后到达终点的最短路 题目分析:如果只有一条河的话就是初中数学的经典问题了, ...

  3. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Dahno Dahno(SW)

    题目链接:点击查看 题目大意:给出一个有 nnn 个点的无向图,要求将其分成两个集合,使得总权值最大,每个集合需要非空 题目分析:SW模板题,套上即可 代码: // Problem: Dahno Da ...

  4. 上海理工大学第二届“联想杯”全国程序设计邀请赛 Identical Day 思维 + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个010101序列,假设有一段长为lll连续的全111子串,定义这段字串不高兴值为l∗(l+1)2\frac{l*(l+1)}{2}2l∗(l+1)​, ...

  5. 2016第二届美亚杯全国电子数据取证大赛团队赛write up

    2016第二届美亚杯全国电子数据取证大赛 团队赛wp 本人TEL15543132658 同wechat,欢迎多多交流,wp有不足欢迎大家补充多多探讨! A部分write up 关于Hugo计算机的附加 ...

  6. 2016年 第二届美亚杯全国电子数据取证大赛个人赛write up

    2016年 第二届美亚杯个人赛write up 本人TEL15543132658 同wechat,欢迎多多交流,wp有不足欢迎大家补充多多探讨! 前景概要: 你会获得一个包含Hugo电脑硬盘的镜像文件 ...

  7. 第二届天府杯数学建模竞赛

    2022年第二届天府杯全国大学生数学建模竞赛正式官宣为省级赛事!四川省生产力促进中心挂牌在四川省自然资源科学研究院,是国家级生产力促进中心和国家级技术转移中心.想参加数模竞赛的快来报名啦~是由成都锦城 ...

  8. 2020 年 “联想杯”全国高校程序设计在线邀请赛暨第三届上海理工大学程序设计竞赛题解

    2020 年 "联想杯"全国高校程序设计在线邀请赛暨第三届上海理工大学程序设计竞赛题解 萌新又来写题解啦 原题链接 (不是按照题号顺序来的QWQ) L. Lottery Ticke ...

  9. 北京理工大学计算机学院赵曜,北理工学子参加第十届蓝桥杯全国软件和专业人才大赛取得佳绩...

    5月25日,第十届"蓝桥杯"全国软件专业人才设计与创业大赛在北京大学.首都经济贸易大学等多所高校同步举办.北京理工大学ACM俱乐部派出的21名参赛队员,经过长达四个小时的激烈角逐最 ...

最新文章

  1. 人均年薪250万, 拥有400名博士, 这家AI公司去年亏27亿
  2. Ubuntu apt-get 源详解
  3. 《数字图像处理》 笔记
  4. 大数据常见组件的访问页面总结
  5. 使用URL在线语音合成
  6. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)
  7. JSP、ASP、PHP Web应用程序怎么这么多P!
  8. 由HTTPS抓包引发的一系列思考(HTTPS解密)
  9. 【C语言】输入一个三位数,逆序输出
  10. ASP.NET底层架构 22
  11. AutoCAD2018_输出与打印
  12. 查询计算机记录,电脑使用记录查询软件_电脑使用记录查询
  13. 小白版教您如何使用SOLIDWORKS MBD
  14. 2022Android高级面试题汇总解答,2022-2022阿里巴巴安卓面试真题解析
  15. matlab处理声音报告,基于MATLAB的语音信号分析与处理的实验报告.doc
  16. Postman请求报405错误
  17. S3DIS 点云数据集的手动修复问题
  18. Sweet32: TLS 64位分组密码生日攻击(CVE-2016-2183)
  19. 酷睿i7 12700h参数 i712700h属于什么级别
  20. python中的输出list中元素方法_python 输出所有列表元素的乘积

热门文章

  1. 给新手看的 Micronaut 入门教程,10 分钟写出一个 Micronaut 程序
  2. 10 分钟学会 5 个酷炫 Linux 命令
  3. php tp5支付宝app支付,支付宝APP支付 统一下单 php服务端 tp5
  4. ConcurrentHashMap的源码分析-put方法第三阶段
  5. Spring-Cloud中的统一配置中心
  6. Spring-Cloud中的负载
  7. Redis存储(实现)原理
  8. 自己写一个实现ApplicationListener​接口并且把该组件加入到容器中
  9. MyBatis相应API
  10. SpringMVC的请求-文件上传-多文件上传的代码实现