文章

99

粉丝

120

获赞

8

访问

96.8k

头像
整除问题1284
综合
发布于2024年3月5日 10:24
阅读数 612

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;
//getPrime就是统计质因子个数的。
void getPrime(vector<int>& factors, int n){
	for(int i=2; i*i<=n; i++){
		while(n % i == 0){
			factors[i]++;
		   //相当于用数组计数,因为题中范围不大,所以可以直接开辟一个1000的数组。
		   //并不是所有位置都用,只有成为n以及后面n--的质因子的位置才用。确实是稍微浪费了一些空间。
			n /= i;
			//这一步就是为了知道该数字有多少了等于i的质因子。比如单独考虑,12=2*2*3,里面有两个2,一个3。
			//则这一步以后factors[2]==2,factors[3]==1。
			if(n <= 1)
				return;
		}
	}
	if(n > 1)
		factors[n]++;
	//自身是一个。
}

int main()
{
	int n,a;
	while(cin>>n>>a)
	{
		vector<int> factor_a(1000), factor_n(1000);
		getPrime(factor_a,a);
		for(int i=2;i<=n;i++)
			getPrime(factor_n,i);在i的质因子统计完以后,factor的已经存了个数,后续也是在这个基础上加
		int k=1000;
		for(int i=2;i<=a;i++)//为什么小于a,上述文字已经说明
		{
			if(factor_a[i])
				k=min(k,factor_n[i]/factor_a[i]);注意前文定义k为int型。
		}
		cout<<k<<endl;
	}
	return 0;
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发