博客
关于我
AIsing Programming Contest 2020 游记 (ABC水题,D思维)
阅读量:411 次
发布时间:2019-03-06

本文共 2124 字,大约阅读时间需要 7 分钟。

A - Number of Multiples

水题

B - An Odd Problem

水题

C - XYZ Triplets

水题,注意数组不要开小了

D - Anything Goes to Zero

这道题思路很妙:

首先计算出字符串中所有 1 的数量 cnt,然后分三种情况:

  • cnt > 1

    对每一位的变化,模数要么为 cnt - 1,要么为 cnt + 1。我们可以先按原字符串计算这两种情况,然后在每一位上进行加减。对于 0 位,只需要加上 2^k 再对 cnt + 1 取模。对于 1 位,只需要减去 2^k(注意负数取模)再对 cnt + 1 取模。

  • cnt = 1

    只有一个 1,模数只能是 cnt + 1。对于 0 位,直接输出 0 即可。

  • cnt = 0

    全部输出 1 即可。


  • 代码实现

    #include 
    using namespace std;typedef long long ll;ll power(ll a, ll b, ll mod) { return b ? power(a * a % mod, b / 2, mod) * (b % 2 ? a : 1) % mod : 1;}ll cal(ll n) { ll cnt = 1; while (n) { n = n % __builtin_popcount(n); cnt++; } return cnt;}int main() { ll n, cnt = 0, ans1 = 0, ans2 = 0, ans; string s; cin >> n >> s; for (int i = 0; i < n; i++) { if (s[i] == '1') cnt++; } if (cnt > 1) { for (ll i = 0; i < n; i++) { if (s[i] == '1') { ans1 = (ans1 + power(2, n - i - 1, cnt - 1)) % (cnt - 1); ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); } } for (ll i = 0; i < n; i++) { if (s[i] == '0') { ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); cout << cal(ans) << endl; } else { ans = (ans1 + ((cnt - 1) - power(2, n - i - 1, cnt - 1) % (cnt - 1)) % (cnt - 1)) % (cnt - 1); cout << cal(ans) << endl; } } } else if (cnt == 1) { for (int i = 0; i < n; i++) { if (s[i] == '1') { ans2 = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); } } for (ll i = 0; i < n; i++) { if (s[i] == '0') { ans = (ans2 + power(2, n - i - 1, cnt + 1)) % (cnt + 1); cout << cal(ans) << endl; } else { cout << 0 << endl; } } } else { for (int i = 0; i < n; i++) { cout << 1 << endl; } } return 0;}

    解释

  • 快速幂函数:用于计算大数的幂模运算,避免数值溢出。
  • 计数1的数量:遍历字符串,统计1的数量cnt
  • 分情况处理:根据cnt的值,选择不同的计算方式。
  • 计算每个位置的结果:根据字符是0还是1,分别计算并输出结果。
  • 通过这种方法,可以高效地解决字符串变换问题,并确保结果正确。

    转载地址:http://aaykz.baihongyu.com/

    你可能感兴趣的文章
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    OpenCV读写avi、mpeg文件
    查看>>
    opencv里用calcCovarMatrix计算协方差矩阵
    查看>>
    OpenCV错误:在setSize中断言失败(s&>;=0)-尝试将图像放置在网络摄像头提要上时
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    OpenERP ORM 对象方法列表
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>
    OpenFeign 入门与实战
    查看>>
    OpenFeign源码学习
    查看>>
    OpenFeign的使用方式成功解锁
    查看>>