题意:给出长方形的面积a和边的下限b,求多少可行解。
题解:唯一分解定理
这里的a是1e12,明显很大,直接暴力处理不行。
先处理a的所有因子数,暴力[1, b),减去即可。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<map>
#define ll long long
using namespace std;
ll t, a, b;
const int MAXN = 1e6;
int prime[MAXN + 1];
void getPrime() {
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= MAXN; i++) {
if (!prime[i])prime[++prime[0]] = i;
for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++) {
prime[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
}
ll getFactors(long long x) {
long long ans = 1;
long long tmp = x;
for (int i = 1; i < prime[0] && prime[i] <= tmp / prime[i]; i++) {
int num = 0;
if (tmp % prime[i] == 0) {
while (tmp % prime[i] == 0) {
num++;
tmp /= prime[i];
}
ans *= (num + 1);
}
}
if (tmp != 1) {
ans *= 2;
}
return ans; //因子数
}
int main() {
scanf("%lld", &t);
int cas = 0;
getPrime();
while (t--) {
scanf("%lld%lld", &a, &b);
ll k = sqrt(a);
if (b > k) {
printf("Case %d: 0\n", ++cas);
continue;
}
ll ans = getFactors(a) / 2;
for (ll i = 1; i < b; i++) {
if (a % i == 0) {
ans--;
}
}
printf("Case %d: %lld\n", ++cas, ans);
}
return 0;
}