yukicoder no.2051 Divideの解説です.
1. 問題
正整数 $A$, $B$ が与えられます. $A$ の約数かつ $B$ の倍数である正整数の個数を解答してください.制約
$1 \leq A,B \leq 10^9$2. 解法
$10^9$ 以下の正整数は,高々約数を $1344$ 個しか持ちません.したがって, $A$ の約数をすべて列挙したうえでそれぞれが $B$ で割り切れるかを判定すればよいです.約数列挙は $O(\sqrt{A})$ で行え,これは十分高速です.ACコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int A,B;
cin>>A>>B;
int count = 0;
for(int i=1;i*i<=A;i++){
if(A%i != 0) continue;
int x = i;
int y = A/i;
count += (x%B == 0)+(y%B == 0 && x != y);
}
cout<<count<<endl;
}
$10^9$ 以下の最大の高度合成数は $735134400$ であり,これが $1344$ 個の約数を持ちます.