整除问题

题目
给定n,a求最大的k,使n!可以被ak整除但不能被a(k+1)整除。

输入描述: 两个整数n(2<=n<=1000),a(2<=a<=1000)

输出描述: 一个整数.

示例1
输入
6 10
输出
1

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

//只要能够包含a的素因数即可
int mark[1005] = {0}; 
int prime[1005] = {0};
int primeSize = 0;

void getPrime(){
    for(int i=2;i<=1000;i++){
        if(mark[i] == 1) continue;
        else{
            //是素数
            prime[primeSize++] = i;
            //标记非素数
            for(int j=i*i;j<=1000;j+=i){
                mark[j] = 1;
            }
        }
    }

}

int main(){
    getPrime();
    
    int n,a;
    int p,e;
    cin >> n >> a;
    
    int ans = 123123123; //一个很大的数
    
    for(int i=0;i<primeSize;i++){
        //寻找a的素因数
        
        p = prime[i];   //素数
        e = 0;          //幂指数
        
        //a的素因数分解:计算关于素数a的幂指数e
        while(a%p==0){
            e++;
            a /= p;
        }
        
        if(e!=0){
            //如果p是a的素因数
            //计算n!中p的幂指数
            int e2 = 0;
            int t = n;
            while(t){
                e2 += t/p;    //1...n中,是p的倍数的数的个数n/p:都能提供1个p
                              //1...n中,是p*p的倍数的数的个数n/(p*p): 都能提供2个p(前面已经计算过1次,所以都提供(2-1)个p)
                t /= p;
            }
            
            //计算k,取最小的
            if(e2/e < ans){
                ans = e2/e;
            }
        }
        
        if(a==1) break; //a的素因数分解完成,提前结束
        
    }
    cout << ans << endl;
    
}

贵交的题好难写噢QAQ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值