整除问题

题目描述

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

输入描述:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出描述:

一个整数.
示例1

输入

6 10

输出

1

 

最终AC代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n, a;
    while(cin >> n >> a){
        int t, ans=1e9, rn[1001]={0};
        for(int i=2; i<=n; i++){ //n!质因子分解
            t = n;
            while(t){
                rn[i] += t / i;
                t /= i;
            }
        }
        for(int i=2; i<=a; i++){ //a的质因子分解
            t = 0;
            while(a%i == 0){
                t++;
                a /= i;
            }
            if(t == 0) continue;
            ans = min(ans, rn[i]/t);
        }
        printf("%d\n", ans);
    }
    return 0;
}

总结:这题用常规思路是没法做出来的,因此数据太大。然后,在评论区看见了以下分析,很有趣(链接):

 

 我上面写的代码没有找出找出素数,但是代码更简洁,在考场上也能解决一些时间。但是,为什么有这个规律,我目前也不是很理解。记录此题的本意是,一个正整数阶乘 => 是可以转化为素数的表达形式的~或者说,任何一个大于1的数都可以表示成这种形式吧?然后,以下部分的代码很经典~

for(int i=2; i<=n; i++){ //n!质因子分解
    t = n;
    while(t){
        rn[i] += t / i;
        t /= i;
    }
}

采用素数表示阶乘,很自然地化解了数据非常大的问题。以后依据大整数的问题,希望能够想起这个思路。

posted @ 2020-04-19 11:00  已是夕阳,不如放下  阅读(251)  评论(0编辑  收藏  举报