拼多多笔试编程

1.给两个数N,M,找到一个最小的大于等于N的满足各位之和是M倍数且本身是M倍数的。N最小好像是1000,挺简单的
2.给一个k一个字符串s,要求返回的答案里各字符数必须是k的倍数,且字典序是小于等于s的,并在此集合中找到字典序最大的。

😭😭😭这题字符串我是真不会哇。。每次遇到字符串都要嗝屁
3.给两个数N,M,求N的阶乘M进制表示下,末尾0的个数,N,M大小都是10^9
😢还好以前搞过数论,不然真就一道题也太惨了。。。先欧拉筛一边,找到M的素数幂次,然后找对应N阶乘的素数幂次。。emmm还挺容易的
#include <bits/stdc++.h>

using namespace std;
const int MAX = 4e4;
int prime[MAX],tot = 0,N,M;
bool isprime[MAX];
int Mprime;
int K(int x,int p){
    return x?K(x/p,p) + x/p:0;
}
int solve(){
    scanf("%d%d",&N,&M);
    int ans = INT_MAX;
    for(int i = 0;i < tot && prime[i] <= M;i++){
        Mprime = 0;
        while(M%prime[i] == 0){
            Mprime++;
            M /= prime[i];
        }
        if(Mprime == 0)continue;
        int cnt = K(N,prime[i]);
        ans = min(ans,cnt/Mprime);
    }
    
    if(ans == INT_MAX)return 0;
    return ans;
}
int Euler(){
    memset(isprime,true,sizeof isprime);
    isprime[0] = isprime[1] = false;
    for(int i =2;i < MAX;i++){
        if(isprime[i])prime[tot++] = i;
        for(int j = 0;i*prime[j] < MAX;j++){
            if(i%prime[j] == 0)break;
            isprime[i*prime[j]] = false;
        }
    }
}
int main(){
    Euler();
    printf("%d\n",solve());
    return 0;
}


#拼多多##笔经##Java工程师#
全部评论
全a 仅供参考 https://www.nowcoder.com/discuss/636123
2 回复 分享
发布于 2021-04-09 17:21
还有一道0、1或X快乐数;楼主说的2、3题我都没做出来,直接凉凉 楼主说的第二题我做了贼久没做出来,直接一波sout(-1),ac25%
点赞 回复 分享
发布于 2021-04-09 16:56
最后一题是卡cin,cout吗?我写的和楼主几乎一样但是只过了90%超时了。。。
点赞 回复 分享
发布于 2021-04-09 17:02
字符串 就哭呗  0.317🤣 ....  4题 0.95不知道错哪儿了 前俩A了
点赞 回复 分享
发布于 2021-04-09 17:06
第二题我用哈希搞了了索引表, 搞来搞去代码越写越难看 直接放弃了
点赞 回复 分享
发布于 2021-04-09 17:07

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
点赞 4 评论
分享
牛客网
牛客企业服务