分解面积的质因子,然后可以得到这个数的所有约数的个数, 就是边数, 然后不是正方形的情况取出, 再考虑 1 2 , 2 1这样的情况, 就是 num/2 然后取出比B小的面积的约数
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
#define MAXN 1000011
#define LL long long
LL prime[MAXN], cnt;
bool vis[MAXN] = {0};
void pri()
{
cnt = 0;
for( int i = 2; i < MAXN; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
for(int j = i+i; j < MAXN; j+=i)
vis[j] = 1;
}
}
}
int main()
{
int T;
LL a, b;
scanf("%d",&T);
pri();
for(int t = 1; t <= T; t++)
{
scanf("%lld %lld",&a, &b);
LL ans = 1;
LL resa = a;
if(b*b >= a)
{
printf("Case %d: 0\n",t);
continue;
}
for( int i = 0; prime[i]*prime[i]<= a; i++)
{
//if(a%prime[i]) continue;
int num = 0;
while(!(a%prime[i]))
{
num++;
a/=prime[i];
}
ans *= (1 + num);
}
if(a > 1)
ans *= 2;
//当有一个约数所形成的边是正方形的时候,ans一定是奇数,那么直接/2就好了,不用特判
ans/=2;
for( int i = 1; i < b ; i++)
if(resa%i == 0) ans--;
printf("Case %d: %lld\n",t, ans);
}
return 0;
}