拼多多笔试编程
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;
}
查看15道真题和解析

