1 条题解
-
0
自动搬运
来自洛谷,原作者为

Rubidium_Chloride
No, I can't.搬运于
2025-08-24 22:18:03,当前版本为作者最后更新于2020-03-02 11:53:56,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
谔谔谔这题是数学+构造题。进博客看效果更好呦!
进入正题:
1.题目大义
有一个长为的串,初始值为,每次可以将它的一位取反,最终值为,让你求出这样不相交的的串的个数的最大值。
2.分析
看到样例和SPJ第一问应该就出来了吧……对于维的情况,很容易构造出一种条的情况如下:
---
---
---
对于这种情况,本蒟蒻就猜想,是不是对于每一个,答案的第一问都是呢?
3.证明
3.1 先证对于每一个,维空间中最多条不相交路径
在维空间中,每个点连出条边;(考虑其每一个二进制位取反所得的结果即可得到。)
0号节点也不例外;
路劲都不能相交;
最多有条路径,命题成立。
3.2 再给出一组构造
对于每一个位串,从右开始其每一位分别设为…….
于是我们可以轻松地给出这样条路径的一组构造(以下均写改变的的下标):
-- …… --
-- …… -- --
……
-- …… --
4.CODE
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll k[69]={1},n;//n<=60,所以要开long long inline int read(){//快读提高速度 register int x=0;char ch=getchar(); while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x; } int main(){ n=read(); printf("%lld",n);//由3.证明,直接输出n即可 for(register int i=1;i<=n-1;i++) k[i]=k[i-1]<<1;//预计算2的幂次,为下面压缩2进制数做准备 for(register int i=0;i<=n-1;i++){ printf("\n0");//有特殊的输入要求就按题目说的来,行末无空格 for(register ll j=0,m=0;j<=n-1;j++){ m+=k[(i+j)%n];printf(" %lld",m);//同Line15,千万不能忘了mod n,否则RE } } return 0; }//皆大欢喜~END~(祝大家看得开心,有意见可以提出来
- 1
信息
- ID
- 4910
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者