Wannafly挑战赛13 zzf的好矩阵 题解

链接:https://ac.nowcoder.com/acm/contest/80/C

分析

  1. 每个格子都有至少一个麦穗
  2. 每个格子最多只能有p*p个麦穗
  3. 任意两个格子的麦穗数不同

结论1

由以上三点易得所有格子的麦穗数为p2p^2p2的全排列。

结论2

对于一个已知的一个符合题意的矩阵,行任意交换,列任意交换,或者所有行列进行转置,所得的矩阵仍然是一个符合条件的解。易得,如此一个基本解可以构造出2∗(p!)22*(p!)^22∗(p!)2个互不相同的解。


转置乘以2.行的顺序有p!p!p!种,列的顺序有p!p!p!种。

结论3

不考虑转置、行列交换等变换,本质不同的解有且只有一个。

以下主要是从不重不漏出发,逐步逼近,找到C(带子)需要满足的条件,最终确定可行的c与r.


用ri,cj,ai,jr_i,c_j,a_{i,j}ri​,cj​,ai,j​分别表示第iii行选中的次数、第jjj列选中的次数,iii行jjj列的麦穗数。

ai,j=ri+cja_{i,j}=r_i+c_jai,j​=ri​+cj​.

r=(r1,r2,r3,...,rp)r=(r_1,r_2,r_3,...,r_p)r=(r1​,r2​,r3​,...,rp​)

c=(c1,c2,c3,...,cp)c=(c_1,c_2,c_3,...,c_p)c=(c1​,c2​,c3​,...,cp​).

对于麦穗数为1的格子,显然只能分解成1+01+01+0或者0+10+10+1.

为了本质不同的解,我们不妨设行和列的选取数从小到大,且第一列取1,第一行取0.即:

r1<r2<r3<...<rp;c1<c2<c3<...<cp;c1=1,  r1=0.r_1 \lt r_2 \lt r_3 \lt ... \lt r_p;\\
c_1 \lt c_2 \lt c_3 \lt ... \lt c_p; \\
c_1 = 1,\;r_1=0.r1​<r2​<r3​<...<rp​;c1​<c2​<c3​<...<cp​;c1​=1,r1​=0.

如此,确定一对r,cr,cr,c就确定了一个基本的解。

容易验证c=(1,2,3,4,...,p),r=(0,p,2p,3p,...,(p−1)p)c=\left(1,2,3,4,...,p\right), r=\left(0,p,2p,3p,...,(p-1)p\right)c=(1,2,3,4,...,p),r=(0,p,2p,3p,...,(p−1)p)是一个解。

接下来要说明只有这一组基本解。


C数组对应带子说明

空白长度论述

不断移动C数组锁画出的这条带子,注意需要满足以下两点要求:

  1. 1-p21\text{-}p^21-p2的中每一个格子都被黑色覆盖一次且仅一次(即不重不漏)。
  2. rir_iri​其实就是第iii次移动相比于初始位置的总的位移量。
  3. 为了不漏,移动之后,下一次带子的开头应对应于还没覆盖的第一个空白格子。

    根据不重不漏,容易推出以下结论。



    l白=kll_{白}=kll白​=kl

后续黑色长度论述



l′=ll^{'}=ll′=l

并且用不重不漏容易推出如果后面还有白色段,则长度一定和前面的白色段等长,再有黑色段,则又和最开始的黑色段等长……

能“密铺”的带子形式及特征



其中l黑=l,l白=kll_{黑}=l,l_{白}=kll黑​=l,l白​=kl

共有k1k_1k1​个kl白+l黑片段。

带子移动k次,加上原本的不移动的一条,则刚好不重不漏的“密铺”了连续的一段。之后只需要按照前面的整体右移即可。

下图是k=3的例子:



带子黑色总长度:

p=(k1+1)lp=(k_1+1)lp=(k1​+1)l

“密铺”一段长度:

l+k1(kl+l)+kl=k1kl+(k+k1+1)ll+k_1(kl+l)+kl=k_1kl+(k+k_1+1)ll+k1​(kl+l)+kl=k1​kl+(k+k1​+1)l

由于ppp是素数。

  1. k1=0,l=pk_1 = 0,l=pk1​=0,l=p,则带子只有第一块黑色的片段,长度为p,故c=(1,2,3,...,p)c=(1,2,3,...,p)c=(1,2,3,...,p),显然要密铺满1−p21-p^21−p2可得r=(0,p,2p,3p,...,(p−1)p)r=(0,p,2p,3p,...,(p-1)p)r=(0,p,2p,3p,...,(p−1)p).或者
  2. k1=p−1,l=1k_1 = p-1,l=1k1​=p−1,l=1,则带子有ppp块黑色的片段,每两个黑色片段之间有一块长度为kkk的白色片段。密铺总长度应该是p2p^2p2的因数。

    p2=k2[k1kl+(k+k1+1)l]=k2[(p−1)k+(k+p)]=k2(k+1)p⇒p=k2(k+1)p^2=k_2\left[k_1kl+(k+k_1+1)l\right]\\=k_2\left[(p-1)k+(k+p)\right]\\=k_2(k+1)p \Rightarrow\\
    p=k_2(k+1)p2=k2​[k1​kl+(k+k1​+1)l]=k2​[(p−1)k+(k+p)]=k2​(k+1)p⇒p=k2​(k+1)

    故

    2.a. k2=1,k=p−1k_2=1,k=p-1k2​=1,k=p−1或

    2.b. k2=p,k=0k_2=p,k=0k2​=p,k=0

    对于2.a可得c=(1,p+1,2p+1,...,(p−1)p+1),r=(0,1,2,3,4,...,p−1)c=(1,p+1,2p+1,...,(p-1)p+1), r=(0,1,2,3,4,...,p-1)c=(1,p+1,2p+1,...,(p−1)p+1),r=(0,1,2,3,4,...,p−1)

    对于2.b可得c=(1,2,3,4,...,p),r=(0,p,2p,3p,...,(p−1)p)c=(1,2,3,4,...,p),r=(0,p,2p,3p,...,(p-1)p)c=(1,2,3,4,...,p),r=(0,p,2p,3p,...,(p−1)p)

综上1,2.a,2.b,

cα=(1,2,3,4,...,p),&ThickSpace;rα=(0,p,2p,3p,...,(p−1)p);cβ=(1,p+1,2p+1,...,(p−1)p+1),&ThickSpace;rβ=(0,1,2,3,4,...,p−1)c_{\alpha}=(1,2,3,4,...,p),\;r_{\alpha}=(0,p,2p,3p,...,(p-1)p);\\
c_{\beta}=(1,p+1,2p+1,...,(p-1)p+1),\; r_{\beta}=(0,1,2,3,4,...,p-1)cα​=(1,2,3,4,...,p),rα​=(0,p,2p,3p,...,(p−1)p);cβ​=(1,p+1,2p+1,...,(p−1)p+1),rβ​=(0,1,2,3,4,...,p−1)

但是,容易发现,∀i,j\forall i,j∀i,j,有

aα,i,j=rα,i+cα,j=[(i−1)p]+[j]=(i−1)p+j=aβ,j,i=rβ,j+cβ,i=[j−1]+[(i−1)p+1]=(i−1)p+ja_{\alpha,i,j}=r_{\alpha,i}+c_{\alpha,j}=[(i-1)p]+[j]=(i-1)p+j\\
=a_{\beta,j,i}=r_{\beta,j}+c_{\beta,i}=[j-1]+[(i-1)p+1]=(i-1)p+jaα,i,j​=rα,i​+cα,j​=[(i−1)p]+[j]=(i−1)p+j=aβ,j,i​=rβ,j​+cβ,i​=[j−1]+[(i−1)p+1]=(i−1)p+j

即α,β\alpha,\betaα,β这两种方案所得矩阵互为转置矩阵。所以应计算成一种基本解。

最终结论

因此,本质不同的解只有一种;考虑矩阵转置、行列交换等,一共有2∗(p!)22*(p!)^22∗(p!)2种解。

Wannafly挑战赛13 zzf的好矩阵 题解 答案解释的更多相关文章

  1. 【瓜分5000元奖金】Wannafly挑战赛13

    链接:https://www.nowcoder.com/acm/contest/80/A来源:牛客网 zzy的小号 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  2. Wannafly挑战赛13 C:zzf的好矩阵(思维)

    题目描述 一个8 * 8的棋盘,第一个格子放1个麦穗,第二个格子放2个麦穗,第三个格子放4个麦穗……那么最后,共要放几个麦穗呢? zzf表示这个问题实在太简单,于是重新规定了游戏的规则. 初始的棋盘为 ...

  3. Wannafly挑战赛13 B:Jxc军训(逆元)

    题目描述 在文某路学车中学高一新生军训中,Jxc正站在太阳下站着军姿,对于这样的酷热的阳光,Jxc 表示非常不爽. Jxc将天空看做一个n*n的矩阵,此时天上有m朵云,这些云会随机分布在m个不同的位置 ...

  4. Wannafly挑战赛13 D.applese的生日(贪心+思维)

    题目描述 最可爱的applese生日啦,他准备了许多个质量不同的蛋糕,想请一些同学来参加他的派对为他庆生,为了不让一部分同学感到不爽,他决定把每个蛋糕都分割成几份(也可以不分割),使得最小的蛋糕的质量 ...

  5. Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出\(n\)个点的一张图,求它的所有生成树中权值和为\(k\)的倍数的个数.输出答案对\ ...

  6. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  7. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  8. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  9. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

随机推荐

  1. Codeforces 1304E 1-Trees and Queries (树上距离+思维)(翻译向)

    题意 给你一棵树,q个询问(x,y,a,b,k),每次问你如果在(x,y)加一条边,那么a到b能不能走k步,同一个点可以走多次 思路(翻译题解) 对于一条a到b的最短路径x,可以通过左右横跳的方法把他 ...

  2. 一台电脑上配置多个git的ssh key

    前几天公司的代码库全部迁移到了阿里云上,在配置git的ssh key的时候遇到了一个问题,那就是自己的密钥在添加时提示已经存在,原来是自己的个人账号上已经添加过这个密钥了,公司分配的账号就不能再添加这 ...

  3. CAS 分析

    CAS是什么 (1) CAS(Compare and Swap) 比较并交换, 比较并交换是在多线程并发时用到的一种技术 (2) CAS是原子操作, 保证并发安全性, 而不是保证并发同步. (3) C ...

  4. 【TensorFlow】TensorFlow获取Variable值,将Variable保存为list数据

    Variable类型对象不能直接输出,因为当前对象只是一个定义. 获取Variable中的浮点数需要从数据流图获取: initial = tf.truncated_normal([3,3], stdd ...

  5. 【WPF学习】第四十七章 WriteableBitmap类

    WPF允许使用Image元素显示位图.然而,按这种方法显示图片的方法完全是单向的.应用程序使用现成的位图,读取问题,并在窗口中显示位图.就其本身而言,Image元素没有提供创建和编辑位图信息的方法. ...

  6. File、FileStream、StreamWriter、StringWriter文件使用总结

    一.File 1.File为静态类 File类,是一个静态类,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件.File类方法的参量很多时候都是路径path.主要提供有关文件的各种操作, ...

  7. GDB gdb 调试

    除了用grmon看汇编调试外,还可以用gdb. 编译的时候加-g gdb app即可进入gdb调试 设置断点:b main.c:10 然后运行程序:run 断点处可以查看变量:display a 其它 ...

  8. Springboot 自动装配置

    Spring Boot 相对于传统的Spring引入了自动配置功能,简化了项目中繁琐的配置,让开发者利用起来更加的简便.快捷.比如内嵌的tomcat容器等,这些都属于Spring Boot自动配置的范 ...

  9. ssh_key认证

    ssh认证流程步骤: 1.主机host_key认证 2.身份验证 3.身份验证通过 原理及更多知识点,请查看好友博客 http://www.cnblogs.com/f-ck-need-u/p/7129 ...

  10. leetcode--js--Two Sum

    问题描述: 给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = ...