代码一(时间复杂度较高)
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int N,num;
while(cin>>N){
while(N--){
cin>>num;
int bound = sqrt(num),ans=0;
for(int i=1;i<=bound;i++){
if(num%bound==0)ans+=2;
}
if(bound*bound==num) ans-=1;
cout<<ans<<endl;
}
}
return 0;
}
代码二(素数筛选法&约数个数定理)
约数个数定理
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = sqrt(1e9)+1;
vector<int> prime; // 保存质数
bool* Initial(){
bool isPrime[MAXN]; // 标记数组
for(int i=0;i<MAXN;i++) // 初始化
isPrime[i] = true;
isPrime[0] = false;
isPrime[1] = false;
for(int i=2;i<MAXN;i++){
if(!isPrime[i]) continue; // 非质数则跳过
prime.push_back(i);
for(int j = i*i;j<MAXN;j+=i)
isPrime[j] = false; // 质数的倍数为非质数
}
return isPrime;
}
int main() {
bool* isPrime = Initial();
int N, Num, answer, factor, k;
cin>>N;
for(int i=0;i<N;i++){
cin>>Num;
answer = 1;
for(int j=0;prime[j]*prime[j]<=Num;j++){
k=1;
while(Num % prime[j]==0){
Num /= prime[j];
k++;
}
answer*=k;
}
if(Num!=1) answer*=2;
cout<<answer<<endl;
}
return 0;
}
#include <iostream>
#include <climits>
using namespace std;
const int MAXN=1001;
struct Element{
int pos;
int nums;
Element(){}
Element(int p,int n):pos(p),nums(n){}
};
int Prime[MAXN];
int primeNum=0;
void Initial(){ // 素数筛选法
int arr[MAXN]={0};
for(int i=2;i<MAXN;i++){
if(arr[i]==0){
Prime[primeNum++]=i;
for(int j=i*i;j<MAXN;j+=i)
arr[j]=1;
}
}
}
Element elemA[MAXN];
Element elemN[MAXN];
int elemNum;
void init(int a){
elemNum=0;
for(int j=0;j<primeNum&&a>1;j++){
int k=0;
while(a%Prime[j]==0){
k++;
a/=Prime[j];
}
if(k>0){
elemN[elemNum]=Element(j,0);
elemA[elemNum++]=Element(j,k);
}
}
}
int main() {
Initial();
int n,a;
while(cin>>n>>a){
init(a);
for(int i=2;i<=n;i++){
int temp=i;
for(int j=0;j<elemNum&&temp>1;j++){
while(temp%Prime[elemN[j].pos]==0){
elemN[j].nums++;
temp/=Prime[elemN[j].pos];
}
}
}
int ans = INT_MAX;
for(int i=0;i<elemNum;i++){
ans = min(ans,elemN[i].nums/elemA[i].nums);
}
if(ans==INT_MAX) cout<<0<<endl;
else cout<<ans<<endl;
}
return 0;
}