题目55:整除问题

来源:互联网 发布:java伪静态 编辑:程序博客网 时间:2024/04/30 00:49

http://ac.jobdu.com/problem.php?cid=1040&pid=54

题目描述:

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

输入:

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

输出:

一个整数.

样例输入:
6 10
样例输出:
1
// 题目55:整除问题.cpp: 主项目文件。#include "stdafx.h"#include <cstdio>#include <cstring>#include <math.h>const int N=1001;bool prime[N];int base_n[N];int base_a[N];void selectPrime(){memset(prime,0,sizeof(prime));prime[0]=prime[1]=true;for(int i=2;i<N;i++){if(!prime[i]){for(int j=i+i;j<N;j+=i)prime[j]=true;}}}void selectBase(int num,int *hash){int tmp=(int)sqrt(1.0*num);for(int i=2;i<=tmp;i++){if(num==1)break;if(!prime[i]){while(num%i==0){hash[i]++;num/=i;}}}if(num!=1)hash[num]++;}bool compare(int *hash1,int *hash2){for(int i=2;i<N;i++)if(hash1[i]<hash2[i])return false;return true;}int main(){    int n,a;selectPrime();while(scanf("%d%d",&n,&a)!=EOF){memset(base_n,0,sizeof(base_n));memset(base_a,0,sizeof(base_a));for(int i=2;i<=n;i++)selectBase(i,base_n);selectBase(a,base_a);int cnt=0;int tmp[N];memset(tmp,0,sizeof(tmp));while(compare(base_n,tmp)){for(int i=0;i<N;i++)tmp[i]+=base_a[i];cnt++;}printf("%d\n",cnt-1);}    return 0;}


原创粉丝点击