https://codeforces.com/gym/102966/problem/L
L. Lets Count Factors
题意为求X和Y分解出互不相同质数集合的并集元素个数
利用容斥原理可知,结果为X分解出的的质数个数加Y分解出的的质数个数减去最大公约数分解出的质数个数
#include <bits/stdc++.h>
const int maxn=10000000;
typedef long long ll;
using namespace std;
int f(int x){//整数快速分解函数
int res=0;
for(int i=2;i*i<=x;i++){//注意x每次都会被更新
if(x%i==0){
res++;
while(x%i==0)x/=i;
}
}
if(x>1)res++;//质数特判
return res;
}
int main()
{
int N;
cin>>N;
while(N--){
int x,y;
scanf("%d %d",&x,&y);
int t=__gcd(x,y);
int ans=f(x)+f(y)-f(t);//容斥原理
printf("%d\n",ans);
}
return 0;
}
如果直接用质数筛,妥妥的logn
#include <bits/stdc++.h>
const int maxn=10000;
typedef long long ll;
using namespace std;
vector<int>prime;
int isprime[10000+5];//线性筛,只需筛到根号1e7即可
void init(){
for(int i=2;i<=maxn;i++)isprime[i]=1;
for(int i=2;i<=maxn;i++){
if(isprime[i]){
prime.push_back(i);
}
for(int j=0;j<prime.size()&&i*prime[j]<=maxn;j++){
isprime[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
}
}
int f(int x){//更快速的整数分解函数
int res=0;
for(int i=0;prime[i]*prime[i]<=x&&i<prime.size();i++){
if(x%prime[i]==0){
res++;
while(x%prime[i]==0)x/=prime[i];
}
}
if(x>1)res++;
return res;
}
int main()
{
init();
int N;
cin>>N;
while(N--){
int x,y;
scanf("%d %d",&x,&y);
int t=__gcd(x,y);
int ans=f(x)+f(y)-f(t);
printf("%d\n",ans);
}
return 0;
}
时间少了一半