首先,算术基本定理(唯一分解定理):
题目分析:根据唯一分解定理,先将a唯一分解,则a的所有正约数的个数为num = (1 + a1) * (1 + a2) *…(1 + ai),这里的ai是素因子的指数,见唯一分解定理,因为题目说了不会存在c==d的情况,因此num要除2,去掉重复情况,然后枚举小于b的a的约数,拿num减掉就可以了
这题好难…整了好长时间
代码如下:
#include <bits/stdc++.h>
using namespace std;
int const MAX = 1e6 + 100;
int p[MAX];
bool u[MAX];
int num, cnt;
long long a, b, tmp;
void get_prime()
{
memset(u, false, sizeof(u));
for (int i = 2; i <= sqrt(MAX); i++)
{
if (!u[i])
{
for (int j = i * i; j <= MAX; j += i)
u[j] = true;
}
}
for (int i = 2; i <= MAX; i++)
if (!u[i])
p[cnt++] = i;
}
void yyh()
{
for (int i = 0; i < cnt && p[i] <= sqrt(tmp); i++)
{
int cc = 0;
while (tmp % p[i] == 0)
{
cc++;
tmp /= p[i];
}
num *= (cc + 1);
}
if (tmp > 1)
num *= 2;
}
int main()
{
int T;
scanf("%d", &T);
cnt = 0;
get_prime();
for (int ca = 1; ca <= T; ca++)
{
scanf("%lld %lld", &a, &b);
if (a < b * b)
printf("Case %d: 0\n", ca);
else
{
num = 1;
tmp = a;
yyh();
num /= 2;
for (int i = 1; i < b; i++)
if (a % i == 0)
num--;
printf("Case %d: %d\n", ca, num);
}
}
return 0;
}