考研机试真题--整除问题--上海交通大学

题目:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入描述:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出描述:
一个整数.
示例1
输入
6 10
输出
1

链接:
https://www.nowcoder.com/practice/8e29045de1c84d349b43fdb123ab586a?tpId=40&tqId=21436&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

代码:

#include <iostream>
#include <fstream>
using namespace std;
const int maxn = 10000;
const int INF = 9999999;
bool mark[maxn + 1];
int prime[maxn + 1];
int primeSize;
int cnt1[maxn + 1];
int cnt2[maxn + 1];

void getPrime(){
    for(int i = 0; i <= maxn; ++i){
        mark[i] = false;
    }
    primeSize = 0;
    for(int i = 2; i <= maxn; ++i){
        if(mark[i]) continue;
        prime[primeSize++] = i;
        if(i >= 1000) continue;
        for(int j = i * i; j <= maxn; j += i){
            mark[j] = true;
        }
    }
}

// to cal prime number of n!
void cal4n(int n){
    for(int i = 0; i < primeSize; ++i){
        int t = n;
        while(t){
            cnt1[i] += t / prime[i];
            t /= prime[i];
        }
    }
}

//void cal4a(int a){
//    for(int i = 0; i < primeSize; ++i){
//        while(a % prime[i] == 0){
//            cnt2[i]++;
//            a /= prime[i];
//        }
//
//    }
//}

int main(){
    int n, a;
    getPrime();
    while(cin >> n >> a){
        for(int i = 0; i < primeSize; ++i){
            cnt1[i] = cnt2[i] = 0;
        }
        cal4n(n);
        int min = INF;

        for(int i = 0; i < primeSize; ++i){
            while(a % prime[i] == 0){
                cnt2[i]++;
                a /= prime[i];
            }
            if(cnt2[i] == 0) continue;
            if(min > cnt1[i] / cnt2[i]){
                min = cnt1[i] / cnt2[i];
            }

        }
        cout << min << endl;


    }
}

猜你喜欢

转载自blog.csdn.net/Void_worker/article/details/81396437