只因子分解 题解

首先要读懂题目,质因子就是质因数。
接下来再看这道题,这道题看似要分解质因数,实际上只要求出这个数的质数因子就可以了。

简化问题:首先这道题是对n\!做分解质因数,实际上就是对n*(n-1)*…*2*1做分解质因数。(废话)我们可以用9*8分解质因数来举例,9*8=(3*3)*(2*2*2),所以对n\!分解质因子就是对<=n的所有数分解质因数,再将各个质因数的数量进行加和。(再进一步简化:(本蒟蒻没做)一些较大的数可以分解成两个较小的数再进行质因数分解,例:144=6*6*4)

解决思路:打表万岁本来想做打表,又怕打表太慢,于是加了亿点优化,做完习惯提交先骗一点分,结果就AC了。

解题方法:外层循环遍历每一个小于等于n的数

for(; n>1; n--)

然后进行一段我也不知道有什么用的代码

if(!a[n]){
	for(int i=2; i*n<=10000; i++){
		a[i*n]=1;
	}
}

没错,我也不知道有什么用,但我第一次编的时候就是加上了。不过对最外层循环改成从2-n可以优化程序。

然后进行质因数分解

int ans=0,cnt=n;
for(int i=2; cnt>1&&i<=cnt; i++){
	if(!a[i]){//没什么大用
		while(cnt%i==0){
			cnt=cnt/i;
			ans++;
		}
	}
	if(ans>0){
		b[i]+=ans;
		ans=0;
	}
}

最后输出

for(int i=0; i<=10000; i++){
   if(b[i]>0){
     cout << i << " " << b[i] << endl;
   }
 }

有一句话叫做题解仅供抄袭和复制使用,但这是不对的。不能学习。下面是优化过但不多的代码。

#include<bits/stdc++.h>
using namespace std;

long long n,a[20000];
long long b[20000];

int main(){
  cin >> n;
	for(int j=2; j<=n; j++){
		if(!a[j]){
			for(int i=2; i*j<=n; i++){
				a[i*j]=1;
			}
		}
		int ans=0,cnt=j;
		for(int i=2; cnt>1&&i<=cnt; i++){
			if(!a[i]){
				while(cnt%i==0){
					cnt=cnt/i;
					ans++;
				}
			}
			if(ans>0){
				b[i]+=ans;
				ans=0;
			}
		}
	}
  for(int i=0; i<=10000; i++){
    if(b[i]>0){
      cout << i << " " << b[i] << endl;
    }
  }
	
	return 0;
}

后记
在我用打表程序直接提交的时候大数据测试点RE了,我便查找了10分钟,发现是数组开小了10倍(悲)

Q:为什么题目有小黑子?
A:因为质因数分解标题名称被抢了=<

9 个赞

写的不错!(但我没赞了)

6 个赞