题解 | 牛客周赛105

小苯的xor构造

https://ac.nowcoder.com/acm/contest/115861/A

描述

疑似首刀A

A. 小苯的xor构造

易得 ,输出 k 0 即可。

print(input(), 0)

B.小苯的权值计算

按题意计算即可

from math import gcd
n = int(input())
a = [0] + list(map(int, input().split()))
b = [0]
g = 0
for i in range(1, n):
    g = gcd(g, a[i]^a[i+1])
print(g)

C.小苯的01矩阵构造

考虑初始全 的情况下进行翻转操作。

不难发现,每次翻转,行和列的异或和均会变化,因此 一定为偶数。

为奇数时无解, 为偶数时在对角线放置 即可。

n, k = map(int, input().split())
if k % 2 == 1:
    print(-1)
else:
    g = [[0 for i in range(n)] for j in range(n)]
    for i in range(k//2):
        g[i][i] = 1
    for i in g:
        print(*i, sep='')

D.小苯的重排构造

不难发现 的值只有 两种,其中 只能由 产生。

我们可以把 视作 基础上 ,只需考虑如何

中由 ,

不难得出 可行的 的范围为 ,对应 两种情况。

满足条件的情况下,我们可以先在开头放置 ,在交替放置 , ,即可构造出

特判 全 时 , 只能为

n, k = map(int, input().split())
a = [0] + list(map(int, input().split()))
c1 = c2 = 0
for i in range(1, n+1):
    c1 += a[i] == 1
    c2 += a[i] == 2
if c1 == n:
    if k == n-1:
        print(*a[1:])
    else:
        print(-1)
else:
    if max(0, c2 - c1 - 1) + n - 1 <= k <= c2 - 1 + n - 1:
        ans = []
        for i in range(k-(n-1) + 1):
            ans.append(2)
        c2 -= k-(n-1) + 1
        for i in range(min(c1, c2)):
            ans.append(1)
            ans.append(2)
        ans += [1] * (c1 - c2)
        print(*ans)
    else:
        print(-1)

E.小苯的xor图

看到异或和考虑拆位。

对每一位考虑,

观察到长度为 的简单路径可以由点的邻居和点的邻居的邻居构成。

因此可以统计每个点周围有几个 ,几个

计算时遍历 的所有邻居,因为我们已经处理了每个点周围有几个 ,几个 ,因此此时可以直接计算出 为起始的所有路径的异或和。

每条路径均会计算两次,因此最后要把答案除

注意 自己也是点的邻居的邻居,计算时要去掉自己。

时间复杂度

void solve(){
    ll n = read(), m = read();
    vector<ll> a(n+1);
    for(ll i=1;i<=n;i++) a[i] = read();
    vector<vector<ll>> w(32, vector<ll>(n+1));
    for(ll i=1;i<=n;i++){
        for(ll bit=31;bit>=0;bit--){
            if((a[i]>>bit)&1){
                w[bit][i] = 1;
            }
        }
    }
    vector<vector<ll>> g(n+1);
    vector<PLL> egs;
    vector<ll> cnei(n+1);
    for(ll i=1,u,v;i<=m;i++){
        u = read(), v = read();
        g[u].pb(v);
        g[v].pb(u);
        egs.pb({u, v});
        cnei[u]++;
        cnei[v]++;
    }
    ll ans = 0;
    for(ll bit=31;bit>=0;bit--){
        vector<ll> nei(n+1);
        ll t = 0;
        for(ll i=1;i<=n;i++){
            for(auto v:g[i]){
                nei[i] += w[bit][v];
            }
        }
        for(ll i=1;i<=n;i++){
            if(w[bit][i]==1){
                for(auto v:g[i]){
                    if(w[bit][v]==1){
                        t += (nei[v]-1);
                    }
                    else{
                        t += cnei[v] - nei[v];
                    }
                }
            }
            else{
                for(auto v:g[i]){
                    if(w[bit][v]==0){
                        t += nei[v];
                    }
                    else{
                        t += (cnei[v] - nei[v] - 1);
                    }
                }
            }
        }
        ans = (ans + t * ((1<<bit)%MOD)%MOD)%MOD;
        //print(t);
    }
    print(ans*ksm(2, MOD-2)%MOD);
}  

F. 小苯的前缀gcd构造

比较神秘的复杂度,加了三个剪枝就过了。

不难发现,如果 不是 的倍数,则 ,这和选择 是一样的效果。

因此我们可以搜索所有的 的倍数的序列,暴力求出每一种的答案。

但是直接交会,可以加上以下几个剪枝:

  • 时一定无解
  • 时输出
  • 第一个数的范围只可能在 中。
g = [[] for i in range(51)]
g[1].append(1)
for i in range(2, 51):
    for j in range(1, i+1):
        if i % j == 0:
            g[i].append(j)
            
def find(n, m, x):
    for fi in range(min(m, x),(x+n-1)//n-1,-1):
        stk = [[[fi], 1, fi]]
        while stk:
            v, s, xx = stk.pop()
            if s == n:
                if xx == x:
                    return v
                continue
            la = v[-1]
            for ne in g[la]:
                stk.append([v+[ne],s+1,xx+ne])
    return [-1] 
                    
for _ in range(int(input())):
    n, m, x = map(int, input().split())
    if x < n:
        print(-1)
    elif x % n == 0:
        print(*[x//n for i in range(n)])
    else:
        print(*find(n, m, x))
牛客系列赛题解 文章被收录于专栏

牛客系列赛题解喵

全部评论
F标记访问状态dp[n][m][n*m]也行,不超过50^4
5 回复 分享
发布于 2025-08-17 21:10 上海
E题为什么要对32循环啊
点赞 回复 分享
发布于 2025-08-24 18:41 广东
《比较神秘的复杂度》
点赞 回复 分享
发布于 2025-08-19 17:37 天津
D题最小情况不应该是21212么,12122贡献是5
点赞 回复 分享
发布于 2025-08-18 13:24 浙江
E 直接枚举路径中心点的邻居或许更简单
点赞 回复 分享
发布于 2025-08-17 21:34 广东

相关推荐

04-24 13:51
已编辑
西安电子科技大学 Java
👋个人背景:211计算机混子,代码能力一般,春招急头白脸参加央国企最后拿下这两个offer👏offer1:中广核工程公司驻陆丰仪控调试,待遇19+4,离家1800km💯offer2:张家口卷烟厂待遇未知,应该有13个(猜测),离家500km牛油们帮忙选一下,家里人不是很喜欢卷烟厂这个offer,但是蜀黍烟草局下岸了
鸿雁于飞:先说offer1:中广核工程公司驻陆丰仪控调试(待遇19+4) 中广核这艘央企大船还是很稳的,集团综合效益稳居央企前列。但你得搞清楚,这个19+4的"19"是总包,不是到手数——招聘宣传待遇里把所有能算的都算进去了,饭卡福利积分啥的全包含,有牛油分享实际到手大概打七折。试用期到手可能就四五千的水平,转正后基本工资4800左右,其余靠绩效、年终、大修费撑着。不过核电的工作环境有点"牢笼感"——核电站位置偏僻,远离繁华都市。工程公司是承包商性质,干活比业主公司累,而且大概率要经常出差,有的岗位年出差天数100天以上。最大问题是你这1800km的距离过于离谱,核电员工工作强度最小的时候一周也就回一次家,离得远回家成本高,夫妻感情和亲子关系都是现实考验。说白了:高薪是拿青春和生活换的。 再来看offer2:张家口卷烟厂(待遇约13个) 张家口卷烟厂是河北中烟下属三家卷烟厂之一,河北中烟主打的"荷花"系列连续多年位居全国高端卷烟品牌销量前列。烟草系统薪资由基本工资+绩效+年终奖构成,综合年薪普遍显著高于当地平均水平,六险二金齐全,福利拉满。有人问"13个是不是太平平无奇了"——关键张家口是四线城市,生活成本低,这13万的购买力相当于深圳的二十多万。离家500km,开车半天到家,周末回趟家完全可行,幸福感直接上两个档次。中广核的牛油说了句大实话: "哪个核电站好?永远是离家近的那个最好。" 选烟厂同理。 但是,卷烟厂的坑你得清楚: 首先卷烟厂和烟草局不一样,卷烟厂是生产操作类岗位,很多要三班倒。报考条件明确写了要能"胜任夜班工作和长时间站立工作"。一线操作工每天盯着流水线卷烟,工作内容高度重复,有入职的人描述为"食之无味弃之可惜"。有牛油直言"卷烟厂和商业性质的烟草公司不一样,前者很坑很累"。其次你家里人不是不喜欢,而是担心你这211计算机科班出身,进了烟厂干操作工,技能会快速退化,未来如果行业改革,技术壁垒不高,转行比较困难。等你干两年再跳出来,技术栈全忘干净了,回头再去敲代码,发现连应届生都卷不过。 老牛油的灵魂三问: 1. 你是更怕穷,还是更怕想家? 如果特别恋家的人跑1800km之外,第一年哭鼻子的概率高达80%。陆丰那地方偏僻单调,核电基地又远又闷,闲下来除了打游戏没啥娱乐,社交圈也窄。找个对象都费劲——牛油亲测核电站"狼多肉少"。 2. 你的代码能力有多"一般"? 如果真的一般,仪控调试和你专业匹配度不算高,这活儿主要是工程改造设计、现场实施管理、在建机组设计审查等,偏工程向而非纯软开。干两年后跳回互联网赛道,竞争力不一定有明显提升。反倒是烟厂不需要你写代码,进去就是稳定躺平。 3. 烟草局下岸这事儿会不会让你耿耿于怀? 如果烟草局是你第一志愿,烟厂只是plan B,那得想清楚:进去了可能每天看着天花板想"如果当初去了烟草局该多好",这种内耗比钱少还折磨人。如果你能接受"反正都是烟草系统,先进去再说"的心态,那倒无所谓。 一句话总结: 如果年轻想拼想闯做技术积累,中广核虽然累和远,但简历上央企核电的金字招牌确实有含金量,加上到手收入在这两个选项里确实更高,考虑到你个人经济情况和家庭状况,假如家里不需要你常回去照顾,家里有兄弟姐妹帮手分担,那先去核电待三四年,积累经验再跳槽也不失为一步棋。 如果想安稳过日子离家近当"人上人",烟厂低线生活成本加持,加上稳定的编制和福利体系,在张家***得滋润,幸福感吊打陆丰。尤其家里人是那种离不开你的,有烟厂的稳定且离家近,比任何高薪都实在。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
03-04 17:20
电力电子工程师
YOUXIANG:你的实习经历和你的项目对不上,搞电源的为什么不去电源厂实习。简历字有点多?单反激和PFC LLC两个项目,技术面可以问的东西都特别多,细节很多,磁性元件设计那些。
点赞 评论 收藏
分享
评论
15
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务