思路:不加素数筛复杂度过不去。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 3;
int prime[N], k, t;
ll a, b;
bool Isprime[N];
void Prime() {//线性筛素数
Isprime[0] = Isprime[1] = 1;
k = 0;
for(int i = 2; i < N; i++) {
if(!Isprime[i])
prime[k++] = i;
for(int j = 0; j < k && i * prime[j] < N; j++) {
Isprime[i * prime[j]] = 1;
if(!(i % prime[j]))
break;
}
}
}
ll euler(ll n) {//唯一分解定理:n=p1^a1 * p2^a2 . . .*pn^an
ll ans = 0, sum = 1;
for(int i = 0; i < k && prime[i]*prime[i] <= n; i++) {
if(n % prime[i] == 0) {
ans = 0;
while(n % prime[i] == 0) {
ans++;//质因子的指数
n /= prime[i];
}
sum *= (1 + ans);//乘法原理求有多少个因子
}
}
if(n > 1)
sum *= 2;//2就是当剩余n时,指数为1,ans=1,sum*=(1+ans)
return sum;
}
int main() {
Prime();
int x = 1;
cin >> t;
while(t--) {
cin >> a >> b;
if(a < b * b) {
printf("Case %d: 0\n", x++);
continue;
}
ll num = euler(a);
num /= 2;
for(ll i = 1; i < b; i++)
if(a % i == 0)
num--;
printf("Case %d: %lld\n", x++, num);
}
return 0;
}