首页 > 拼多多笔试编程
头像
Macarons
编辑于 2021-04-24 17:34
+ 关注

拼多多笔试编程

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;
}


全部评论

(5) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐