文章

11

粉丝

27

获赞

19

访问

1.3k

头像
整除问题 题解:
P1284 上海交通大学机试题
发布于2025年1月16日 18:03
阅读数 126

#include<bits/stdc++.h>
using namespace std;
//质因子在本题中的作用要搞清楚,就是,如果a/b能整除,那么b的质因子一定是a的质因子的子集。
//若a=a1*a2*a3*...*an,那么a的质因子就是a1、a2、...、an的质因子的集合 
//质因子中的质字体现了每个质因子的独特性,即如果b有k个质因子x,
//那么a必须有大于等于k个质因子x才能保证a/b能整除
//再看本题,n!=1*2*3*...*n,所以n!的质因子就是1、2、3、、、n的质因子的集合
//a^k=a*a*...*a,那么a^k的质因子的集合就是a的质因子集合乘k
//条件1:要保证n!/a^k能整除,那么需保证,对于n!中的每一个质因子x,
//若有n![x]=s,则必须保证0<=a[x]*k<=s 
//同时,a中不能有n!中不存在的质因子,否则怎么整除?
//条件2:接着还要保证n!/a^(k+1)不能整除,这就是说a^k中某个质因子的个数但凡多加一个,
//就会超过该质因子在n!中的个数从而导致无法整除
//这是一个边界条件,保证了k的唯一性,由条件1和条件2可以写出 k=min(k,n![x]/a[x]) 

void findzhi(int n,int *a){        //i从1开始,能保证求的是质因子的个数吗? --能 
	for(int i=2;i*i<=n;i++){ //易错:i从2开始 
		while(n%i==0){
			n=n/i;
			a[i]++;
//			cout<<a[i]<<endl;
			if(n<=1) return;  //1的个数不必记录,1不是素数更不可能是质因子 
		}
	}
	if(n>1) a[n]++;  //最后剩下的n也要加上; 
} 

int main(){
	int n,a,ans;
	//为了记录n和a的质因子集合,设置两个数组,az[i]=s意即a有s个质因子i 
	int az[1000],nz[1000]; 
 	while(cin>>n>>a){
 		memset(az,0,sizeof...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发