√n/log(n) 求出n的所有约数(筛素数,然后对素数试除求出质因数,dfs出约数),然后判断是否满足条件即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int N=5e4+10,M=100;
int n;
int primes[N],cnt;
bool st[N];
P factor[M];
int cntf;
int divider[N],cntd;
void get_primes(int n){
for(int i=2;i<=n;i++){
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++){
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
void dfs(int u,int p){
if(u==cntf){
divider[cntd++]=p;
return;
}
for(int i=0;i<=factor[u].second;i++){
dfs(u+1,p);
p*=factor[u].first;
}
}
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int main(){
get_primes(N-1);
cin>>n;
while(n--){
int a0,a1,b0,b1;
cin>>a0>>a1>>b0>>b1;
int d=b1;
cntf=0;
for(int i=0;primes[i]<=d/primes[i];i++){
int p=primes[i];
if(d%p==0){
int s=0;
while(d%p==0) d/=p,s++;
factor[cntf++]={p,s};
}
}
if(d>1) factor[cntf++]={d,1};
cntd=0;
dfs(0,1);
int res=0;
for(int i=0;i<cntd;i++){
int x=divider[i];
if(gcd(x,a0)==a1&&(ll)x*b0/gcd(x,b0)==b1){
res++;
}
}
cout<<res<<endl;
}
}
大佬 我想问下这个代码的时间复杂度是怎么算的呢?
$质数定理:$
$1∼n 中的质数个数约为 \frac {n} {ln{n}}$
对所求的质数dfs组合出约数的复杂度是常数的,复杂度可以忽略常数
能说说为什么是常数吗?
int以内最多1000多个约数,十分少的