小红书 9.10笔试

编程题三道:

1.给一个数n,如果有连续的x*(x+1)*(x+2)....这种公差为1的数(至少3个)相乘刚好为n,则称之为“好数”;判断YES or NO

2.之前原题,01字符串更改,输出最少 [ L , R ] 更改数 使得整体字符串回文;

3.给定一个数n(小于10^18),计算,其中highdig定义为 i 的二进制表示中最高位 1 所在的位置:比如3:11,highdig(3)就是2。最后结果对998244353取余。

MD差一点点就写出来了,最后求和的时候少写了一个 +1 啊。

下面给出我(认为)的正确代码:

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int T = 0;
    cin >> T;

    vector<long long> doubles(61, 0);

    for (int i = 0; i < 61; i++) {
        doubles[i] = (long long)pow(2, i);
    }

    vector<long long> sums(61, 0);
    for (int i = 1; i < 61; i++) {
        sums[i] = sums[i - 1] + i * (((doubles[i] - 1) + doubles[i - 1])%998244353) * ((doubles[i] - doubles[i - 1])%998244353) / 2;
        if (sums[i] >= 998244353) sums[i] = sums[i] % 998244353;
    }

    while (T--) {
        long long n;
        cin >> n;
        int x = 0;
        for (int i = 0; i < 61; i++) {
            if (n < doubles[i]) {
                x = i;
                break;
            }
        }

        long long res = sums[x - 1] + (long long)x * (n - doubles[x - 1]+1) * (n + doubles[x - 1]) / (long long)2;

        cout << res % 998244353 << endl;
    }
    return 0;
}

还有选择题20道,大部分与机器学习(深度学习)相关。还有一个构建哈夫曼树什么的。

全部评论

相关推荐

09-10 10:30
已编辑
前端工程师
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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