题目大意
给出矩形面积ab,和组成该矩形的边的最小值,问这种面积为ab的矩形有几种
比如样例12 2,矩形面积为12,组成这样矩形的最小边为2,共有2种这样的矩形(2, 6),(3, 4)(这些边都大于或等于2,其中(2,6)和(6,2)是同一种)
解题思路
唯一分解定理:N = p1a1*p2a2p3^a3 … pn^an(其中p1、p2、… pn为N的因子,a1、a2、… 、an分别为因子的指数)
N的因子个数 M = (1 + a1)(1 + a2)(1 + a3)…*(1 + an);
用唯一分解定理求出ab的因子个数,但题要求的是满足条件的因子对数,所以最终所求的因子个数需要除以2,然后再将不满足的减去
详细见代码
代码如下
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int a[maxn],k;
bool b[maxn];
void prime()
{
int i,j;
b[1]=b[0]=true;
for(i=2;i<maxn;i++)
{
if(b[i]==false)
{
a[k++]=i;
for(j=i+i;j<=maxn;j+=i)
b[j]=true;
}
}
}
//筛选因子
ll solve(ll n)
{
ll ans=0,sum=1,i;
for(i=0;i<k&&a[i]*a[i]<=n;i++)
{
if(n%a[i]==0)
{
ans=0;
while(n%a[i]==0)
{
ans++;
n/=a[i];
}
sum*=(1+ans);
}
}
if(n>1) //n未除尽时,说明还剩下一个素数,此时ans等于1
sum*=2;
return sum;
}
int main()
{
prime();
int t,i,x=0;
ll s,n,m;
cin>>t;
while(t--)
{
x++;
cin>>s>>m;
if(s<m*m)//因为要大于等于m
{
cout<<"Case "<<x<<": 0"<<endl;
continue;
}
n=solve(s);
n/=2;
for(i=1;i<m;i++)
{
if(s%i==0)
n--;
}
cout<<"Case "<<x<<": "<<n<<endl;
}
return 0;
}