Đếm ước của một số $O(sqrt(n))$

long long countDiv(long long n)
{
	long long cnt = 0;
	for(int i=1; 1ll*i*i <= n; i++)
	{
		if(n % i == 0)
		{
			if(n / i == i) cnt++;
			else cnt += 2;
		}
	}
	return cnt;
}

Lấy các ước của một số $O(sqrt(n))$

vector<int> Div;
void countDiv(long long n)
{
	for(int i=1; 1ll*i*i <= n; i++)
	{
		if(n % i == 0)
		{
			if(n / i == i) Div.pb(i);
			else
			{
				Div.pb(i);
				Div.pb(n/i);
			} 
		}
	}
}

Đếm ước nâng cao cho nhiều số và mỗi lần truy vấn $O(1)$:

long long cntDiv[N+5];
for(int i = 1; i*i <= N; i++) 
        for(int j = i*i; j <= N; j+=i) 
            cntDiv[j]++;
for(int i = 1; i <= N; i++) cntDiv[i]*=2; 
for(int i = 1; i*i <= N; i++) cntDiv[i*i]--;