文章
11
粉丝
27
获赞
19
访问
1.3k
#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...
登录后发布评论
暂无评论,来抢沙发