【CSP模拟赛】Freda的旗帜
题目描述
要开运动会了,Freda承担起了制作全校旗帜的工作。旗帜的制作方法是这样的:Freda一共有C种颜色的布条,每种布条都有无数个,你可以认为这些布条的长、宽、厚都相等,只有颜色可能不同。每个旗帜都是由一些布条横向拼接起来的,如图所示,图上所示的是一面红、黄、蓝三种颜色布条拼接的旗帜:
就不给你看图
布条数目不同的旗帜显然是不同的。对于布条数目都为T的两面旗帜,如果存在从左到右第i(0<i<=N)个布条颜色不同,那么就认为这两面旗帜是不同的。旋转或翻转后才相同的旗帜被认为是不同的旗帜,比方说,“红黄蓝”和“蓝黄红”被认为是不同的旗帜。有的时候,一些颜色放在相邻的位置上会显得很不好看,比方说红色和绿色放在一起就很不好看。作为一个完美主义者,Freda可不想这样。
全校共有N个班级,不同的班级必须使用不同的旗帜,Freda也就需要制作N面不同的旗帜了。和谐起见,Freda想让使用布条数目最多的那面旗帜使用的布条数目最少,请你帮助Freda计算一下,在避免了不好看的情况之后,使用布条数目最多的那面旗帜最少要用多少布条。
输入格式
第一行两个整数N,C,表示班级的数目和Freda拥有C种颜色的布条。
接下来C行,每行一个长度为C的字符串,每个字符都为’0’或’1’,第i行第j个字符表示第i种颜色和第j种颜色是否能够相邻。如果能,第i行第j个字符为’1’,否则为’0’.保证第i行第j个字符与第j行第i个字符相同。
输出格式
一行一个整数,表示制作了N面不同的旗帜的情况下,使用布条数目最多的那面旗帜最少需要多少布条。
输入样例
10 2
11
11
输出样例
3
提示
样例解释
我们分别制作如下旗帜:
(1),(2),(1,1),(1,2),(2,1),(2,2),(1,1,1),(1,1,2),(1,2,1),(1,2,2)
用布条最多的旗帜所用布条为3.
数据范围与约定
对于50%的数据,保证0 < N <= 50000.
对于80%的数据,保证0 < N <= 10^9.
对于100%的数据,保证0 < N <= 10^18, 0 < C <=10且数据一定有解.
分析
这个题也想了半天,其实是因为睡着了
设f[i][j]表示有旗帜长度为i的时候,第j种颜色开头的方案数,V[i][j]表示i后面是否可以接j
那么就有
$$f[i][j]=\sum_{k=1}^{c}f[i-1][k]*V[j][k]$$
发现这个东西可以反手一个矩阵加速闷声发大财,所以对于每一个长度,我们可以很快求出这个长度下的方案数
而且我们还可以发现长度与方案数是单调递增的,所以可以二分长度,求出这个长度下的方案数的总和,看它是否能大于要求的方案数n
当然,方案数统计出来可能会炸longlong,我们可以重新定义一个类似longlong的结构体,结构体里除了longlong还要再来一个标记,标记这个数是否超过了n
Code
#include<cstdio>
#include<cstring>
long long n;int c;
struct ll{long long num;bool fl;};
struct node{ll mat[][];}a,g;
ll operator +(ll a,ll b){return (ll){a.num+b.num,a.fl||b.fl||(a.num+b.num>=n)};}
ll operator *(ll a,ll b)
{
if((a.num==&&!a.fl)||(b.num==&&!b.fl))return (ll){,};
return (ll){a.num*b.num,a.fl||b.fl||(double(a.num)*double(b.num)>=double(n))};
}
node operator *(node a,node b)
{
node res;memset(res.mat,,sizeof res.mat);
for(int i=;i<=c+;i++)for(int j=;j<=c+;j++)for(int k=;k<=c+;k++)
res.mat[i][k]=res.mat[i][k]+a.mat[i][j]*b.mat[j][k];
return res;
}
node qp(node a,node g,long long k)
{while(k){if(k&)a=a*g;g=g*g;k>>=;}return a;}
int main()
{
scanf("%lld%d",&n,&c);
for(int i=;i<=c;i++)for(int j=;j<=c;j++)scanf("%1lld",&g.mat[i][j].num);
for(int i=;i<=c;i++)a.mat[][i].num=,g.mat[i][c+].num=;g.mat[c+][c+].num=;
long long l=,r=n,mid,ans;
while(l<=r)
{
mid=(l+r)>>;
node nw=qp(a,g,mid);ll sum=nw.mat[][c+];
if(sum.fl)ans=mid,r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
}
【CSP模拟赛】Freda的旗帜的更多相关文章
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【CSP模拟赛】Freda的迷宫(桥)
题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过. 黄昏 ...
- CSP模拟赛2游记
这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...
- 【csp模拟赛4】基站建设 (station.cpp)
[题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...
- 【CSP模拟赛】starway(玄学建边 最小生成树)
问題描述 小w伤心的走上了 Star way to heaven. 到天堂的道路是一个笛卡尔坐标系上一个n×m的长方形通道(顶点在(0,0))和(n,m)),小w从最左边任意一点进入,从右边任意一 ...
- 【CSP模拟赛】Confess(数学 玄学)
题目描述 小w隐藏的心绪已经难以再隐藏下去了.小w有n+ 1(保证n为偶数)个心绪,每个都包含了[1,2n]的一个大小为n的子集.现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2. 输入描述 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- 【CSP模拟赛】凤凰院凶真(最长公共上升子序列)
题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公 ...
- 【CSP模拟赛】天才绅士少女助手克里斯蒂娜(线段树&读入优化&输出优化)
题面描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响.选取显像管的任意一个平面,一开始平面内有个n电子,初始速度分别为vi,定义飘升系数为 $$\sum_{1\leqsl ...
随机推荐
- 微信小程序和asp.net core基于docker和nginx的交互
这个文章的题目起的比较长,我想实现这样一个产品: 前端是微信小程序,后端是基于docker运行的asp.net core webapi.webapi通过nginx实现的反向代理接入,nginx同样基于 ...
- vue中的插槽
匿名插槽 // comp1 <div> <slot></slot> </div> // parent <comp>hello</com ...
- 解决在页面中无法获取qrcode.js生成的base64的图片
应用场景 生成带二维码的推广海报图片 旧方法: 将用户自己的推广连接先通过qrcode.js生成二维码,然后再用后台返回的一张背景图片和二维码通过canvas绘制成一张海报. 问题 在部分安卓手机上获 ...
- SPRINGBOOT注解最全详解(
# SPRINGBOOT注解最全详解(整合超详细版本) 使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 ...
- 自定义View(五),onLayout
转自http://blog.csdn.net/a396901990/article/details/38129669 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onM ...
- springboot 解决 数字长度过长导致JS精度丢失问题
问题 在开发过程中,我们的主键字段使用了数字作为主键ID,发现数字精度丢失的问题. 上图红框是后端日志的输出. 在浏览器端F12 看到的结果如上图,数据居然自动变化,这个是数字在浏览器丢失了精度,导致 ...
- 【原】命令行增删改查阿里云 DNS
命令行解析阿里云 DNS 项目地址:https://github.com/liyongjian5179/alidns 首先需要获取阿里云账号账号的AccessKeyID及AccessKeySecret ...
- SaltStack--项目实战
saltstack项目实战 项目架构规划 后端web服务器使用Nginx+Php作为站点,通过HAproxy做负载均衡,Keepalived做高可用 项目环境准备 说明: 关闭防火墙.selinux. ...
- Beta冲刺第1次
二.Scrum部分 1. 各成员情况 张祥 学号:201731062624 今日进展 完善了人脸识别页面效果 存在问题 无 明日安排 视后勤组和web后端情况而定 截图 陈远杨 学号:20173106 ...
- Detectron2源码阅读笔记-(一)Config&Trainer
代码结构概览 核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可视化的代 ...