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) 回帖