首页 > 其他 > 详细

吉比特 笔试 4.1

时间:2020-04-02 22:56:40      阅读:118      评论:0      收藏:0      [点我收藏+]

只看编程题

第一题题意:给一个n,问离最n最近的素数,相同距离优先考虑小的(1≤n≤1e9)

不贴代码了,大家应该都会。

思路:暴力check前后即可,或者用其他的筛法也可以(像欧拉筛)

第二题题意:给一个由1到9组成的数字串,长度不超过15,问排列组合中有多少能被m整除?(1≤m≤50)

自己写的状压,对拍了一下应该没问题(有问题请指正)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long ll;
ll dp[1 << 16][55];
char s[50];

int main() {
    ll l, r, n, m, i, j, t;
    while (scanf("%s %lld", s, &m) != EOF) {
        n = strlen(s);
        memset(dp, 0, sizeof(dp));
        sort(s, s + n);//对数字进行排序
        dp[0][0] = 1;
        for (i = 0; i < (1LL << n); i++) {
            for (j = 0; j < n; j++) {
                if (!(i & (1LL << j))) {
                    if (j == 0 || s[j] != s[j - 1] || (i & (1LL << (j - 1)))) {//保证对于同一数字按序
                        for (t = 0; t < m; t++) {
                            dp[i ^ (1LL << j)][(t * 10 + (s[j] - 0)) % m] += dp[i][t];
                        }
                    }
                }
            }
        }
        printf("%lld\n", dp[(1 << n) - 1][0]);
    }
}

 

吉比特 笔试 4.1

原文:https://www.cnblogs.com/Carits/p/12622861.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!