九度OJ-1104:整除问题

    xiaoxiao2021-03-26  20

      我的思路就是分别将n,a进行分解质因数并把幂次存储在两个power数组里,然后按照a的质因数去遍历,计算每个质因数p的“在n中幂次/在a中幂次"的比值,比值中最小的即为k。

      机试指南上提供了另一种高效得多的算法,真是相形见绌啊=皿=

    题目地址:点击打开链接

    题目描述:

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

    输入:

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

    输出:

    一个整数.

    样例输入: 6 10 样例输出: 1 来源: 2011年上海交通大学计算机研究生机试真题 答疑:

    解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7827-1-1.html

    #include <iostream> #include <cmath> using namespace std; int main(){ int n,a,k,temp; bool isPrime[1000]; int prime[200]; int primeSize; int powerN[1000],powerA[1000]; int facA[200]; int facASize; //preprocess for (int i=2;i<1000;i++){ isPrime[i]=true; } primeSize=0; for (int i=2;i<1000;i++){ if (isPrime[i]==true){ prime[primeSize]=i; primeSize++; for (int j=i*i;j<1000;j+=i){ isPrime[j]=false; } } } while (cin>>n>>a){ //initiate for (int i=0;i<1000;i++){ powerN[i]=powerA[i]=0; } facASize=0; //resolve for (int m;n>1;n--){ m=n; for (int i=0;i<primeSize;i++){//resolve n! if (m%prime[i]==0){ do{ powerN[prime[i]]++; m/=prime[i]; } while(m%prime[i]==0); } if (m==1) break; } } for (int i=0;i<primeSize;i++){//resolve a if (a%prime[i]==0){ facA[facASize]=prime[i]; facASize++; do{ powerA[prime[i]]++; a/=prime[i]; } while(a%prime[i]==0); } if (a==1) break; } //calculate k k=powerN[facA[0]]/powerA[facA[0]];//initiate k for (int i=1;i<facASize;i++){//遍历facA数组 i从1开始 temp=powerN[facA[i]]/powerA[facA[i]];//temp记录N中该因数的幂次是A中的几倍 if (temp<k) //若该因数在n!中的幂次与在a中的幂次的比值temp是目前最小的 k=temp; } //output cout<<k<<endl; } return true; }

    转载请注明原文地址: https://ju.6miu.com/read-661584.html

    最新回复(0)