给一对数字 a,b 。其中,a表示一个矩形的面积,想知道有多少种整数的边的组合可以组成面积为a的矩形,而且要求矩形的最短的边不得小于b
Input
第一行是一个整数 T (≤ 4000), 表示数据的组数.
每组数据包含两个整数: a b (1 ≤ b ≤ a ≤ 1012) 其中 a 表示矩形的面积 ,b为最小边.
Output
对每组数据, 输出数据序号及可能的矩形的个数.
Sample Input
2
10 2
12 2
Sample Output
Case 1: 1
Case 2: 2
**a是方形面积,最小边要大于等于b。这里还有唯一分解定理:
将面积的正因子个数都取出来,因为长宽可以互换,所以将个数除以二,最后在将小于b的边筛掉
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<vector>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1000;
const int maxn=1e7+10;
int t, n, ans;
int pri[1000000], cnt;
bool ispri[maxn];
void init()
{
for(int i = 2; i < maxn; i++) {
if(!ispri[i]) {
pri[cnt++] = i;
}
for(int j = 0; j < cnt && i * pri[j] < maxn; j++) {
ispri[i * pri[j]] = true;
if(i % pri[j] == 0) break;
}
}
}//素数筛、唯一分解
int main()
{
init();
cin>>t;
int cas=0;
while(t--){
ll a,b;
cin>>a>>b;
ll c=a;
ans=1;
if(b >= sqrt(a)) {
printf("Case %d: 0\n", ++cas);
continue;
}
int num;
for(int i=0;i<cnt;i++){
ll t=pri[i];
if(t*t>c) break;
num=0;
while(c%pri[i]==0){
c/=pri[i],num++;
}
ans*=(num+1);//(x1+1)*(x2+2)
}
if(c>1)
ans*=2;
ans/=2;
for(int i=1;i<b;i++)
if(a%i==0){
ans--;
}
printf("Case %d: %d\n", ++cas, ans);
}
return 0;
}