题目描述
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出
一个整数
样例输入
6 10
样例输出
1
(说实话,我这个没太看懂来着,也没仔细看,王道书的P82)
#include <iostream> #include<string.h> #include<cstdio> using namespace std; bool mark[1010]; int prime[1010]; int primesize; void init(){ primesize = 0; for(int i=2;i<=1000;i++){ if(mark[i]) continue; prime[primesize++] = i; for(int j=i*i;j<=1000;j+=i) mark[j] = true; } }//筛选素数 int cnt[1010]; int cnt2[1010]; int main() { int n,a; init(); scanf("%d %d",&n,&a); memset(cnt,0,sizeof(cnt)); memset(cnt2,0,sizeof(cnt2)); for(int i=0;i<primesize;i++){ int t=n; while(t){//确定素数prime[i]在n中的因子数 cnt[i] += t/prime[i]; t /= prime[i]; }//依次计算t/prime[i]^k,累加其值,直到t/prime[i]^k变为0 } int ans = 123123123;//答案初始值为一个大整数,为取最小值做准备 for(int i=0;i<primesize;i++){//对a分解素因数 while(a % prime[i] == 0){ cnt2[i]++; a /= prime[i]; }//计算a中素因数prime[i]对应的幂指数 if(cnt2[i] == 0)//若该素数不能从a中分解到,即其对应的幂指数为0,跳过 continue; if(cnt[i]/cnt2[i] < ans)//计算素数prime[i]在两个数中因子数的商 ans = cnt[i]/cnt2[i];//统计这些商的最小值 } printf("%d\n",ans); return 0; }