【发布时间】:2021-05-11 10:14:04
【问题描述】:
好的,所以我试图找到比 O(sqrt(n)) 更好的时间因子,这让我查找了 Sieve 方法。现在我试图找到小于给定 n(n
#include <bits/stdc++.h>
#define lli long long int
using namespace std;
const int Max=1000001;
lli prime[Max];
void sieveGen()
{
prime[0]=0;
prime[1]=1;
for(lli i=2;i<Max;i++)
{
prime[i]=i;
}
for(lli i=4;i<Max;i+=2)
{
prime[i]=2;
}
for(lli i=3;i<Max;i++)
{
if(prime[i]==i)
{
if(i*i>Max)
{
break;
}
for(lli j=i*i;j<Max;j+=i)
{
if(prime[j]==j)
{
prime[j]=i;
}
}
}
}
}
lli count_factors(lli num,lli i)
{
if(i==2)
return 1;
if(i==3)
{
if(num%2==0)
{
return 2;
}
else
{
return 1;
}
}
lli ans=1;
lli count=1;
lli first_prime=prime[num];
lli second_prime=num/prime[num];
while(second_prime!=1&&firstprime<i)
{
if(prime[second_prime]==first_prime)
{
count++;
}
else
{
first_prime=prime[second_prime];
ans=ans*(count+1);
count=1;
}
second_prime=second_prime/prime[second_prime];
if(first_prime<i)
{
ans=ans*(count+1);
}
}
return ans;
}
int main() {
sieveGen();
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin>>t;
while(t--)
{
lli N,M,res=0;
cin>>N>>M;
if(M==1)
{
res+=N-1;
}
else
{
for(lli i=2;i<=N;i++)
{
lli num=M-(M%i);
if(num>0)
{
cout<<i<<"."<<count_factors(num,i)<<"\n";
res+=count_factors(num,i);
}
else
{
res+=(i-1);
}
}
}
cout<<res<<"\n";
}
return 0;
}
在这里,我想找出小于i的num的因子个数。
这对于任何素数 i 都可以正常工作,但对于其他一些数字(例如 6)则失败。
非常感谢任何帮助。
【问题讨论】:
-
这个函数怎么调用?
prime是什么? -
我用完整的代码编辑了帖子。
prime是一个数的所有最小素因数中的筛子。 -
那为什么是
prime[1]=1? 1 不是素数... -
因为我们正在运行从 2 到 N 的代码,所以永远不会遇到
prime[1]。我就这样保持着。 -
素数分解?因此,当它达到 1 时,我们知道不再可能对数字进行素因数分解