蓝桥杯打卡Day7


文章目录

  • 阶乘的末尾0
  • 整除问题

一、阶乘的末尾0IO链接

**本题思路:**由于本题需要求阶乘的末尾0,由于我们知道2*5=10可以得到一个0,那么我们就可以找出2的数和5的数,但是由于是阶乘,所以5的数量肯定是小于2的数量,因此我们只需要知道5的数量即可,这里只需要算含有5的次幂的数目即可。

cpp 复制代码
#include <bits/stdc++.h>

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);
  
  int n;
  std::cin>>n;
  
  //这里我们可以知道2和5的乘积能得到0,那么我们可以知道某个数的阶乘中2这个质因子的次数肯定大于5这个质因子出现的次数
  int cnt=0;
  while(n){
    cnt+=n/5;
    n/=5;
  }
  
  std::cout<<cnt<<std::endl;
  return 0;
}

二、整除问题IO链接

**本题思路:**我们可以把 a 给拆分成若干个质因子之积,然后看下 2 ~ n 中包含多少个对应的质因子,就能得出来最多可以整除 a 的多少次方。比如 a 中有质因子p1、p2、p3,2 ~ n 中有对应的质因子、num1、num2 ... 个,那 k 的最大值也就是若干个 num 的最小值。

cpp 复制代码
#include <bits/stdc++.h>

int n,a;
std::vector<std::vector<int>> ans;

void divide(int n)
{
    for(int i=2;i<=n/i;i++){
        if(n%i==0){
            int s=0;
            while(n%i==0){
                s++;
                n/=i;
            } 
            ans.push_back({i,s});
        }
       
    }
    
    if(n>1) ans.push_back({n,1});
    
}

int get_p(int n,int p)
{
    int cnt=0;
    while(n){
        cnt+=n/p;
        n/=p;
    }
    return cnt;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    std::cin>>n>>a;
    
    divide(a);
    int res=INT_MAX;
    for(int i=0;i<ans.size();i++)
        res=std::min(res,get_p(n,ans[i][0])/ans[i][1]);
    std::cout<<res<<std::endl;
    return 0;
}
相关推荐
懒惰才能让科技进步29 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara43 分钟前
函数对象笔记
c++·算法
泉崎1 小时前
11.7比赛总结
数据结构·算法
你好helloworld1 小时前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角2 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple2 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少2 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs112 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋3 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp3 小时前
Java:数据结构-枚举
java·开发语言·数据结构