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

本文共 2180 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>