【发布时间】:2016-11-02 08:37:55
【问题描述】:
我想存储从 1 到 10^6 的所有数字的所有除数。但这似乎太慢了。这是我的代码的 preprocess() 函数:
for(int i=1; i<=1000000; i++)
{
for(int j=1; j<=i/2; j++)
{
if(i%j==0)
divi[i][j] = true;
}
}
我是这样使用地图容器的:
map <int, bool> divi[1000010];
然后我试图找到两个给定数字的公约数。
preprocess();
int T, A, B;
cin >> T;
while(T--)
{
cin >> A >> B;
int common = 0;
for(it = divi[A].begin(); it!=divi[A].end(); it++)
{
if(divi[B][it->first]==true)
common++;
}
cout << common << endl;
我现在应该如何接近以使其足够快?
【问题讨论】:
-
请注意,
divi[B][it->first] == true将创建一个新的映射条目(如果不存在)。这会变得非常昂贵,尤其是对于素数。 -
顺便说一句,
std::map <int, bool>可能会被std::set<int>替换。 -
通过使用 sieve 方法,您可以摆脱预处理器方法中的模和除法。
-
筛法的主要优点是不用检查所有元素,模和除法几乎和乘法一样快。
标签: c++ time-complexity factors