题意:
a可以写成两个因子相乘的形式,要找出一共有多少中两个不同因子相乘的组合,要求每个因子都大于b
思路:
求两个因子的组合只要求出所有因子数然后除以二就行了,求因子数为:
sum=(s[0]+1)*(s[1]+1)*(s[2]+1)……
//s[i]为a的一个素因子的个数。
然后暴力求出小于b的所有因子减去就行了,因为当b>sqrt(a)时所有因子都不满足,所以最大只要扫到1e6的大小刚好卡过。
代码:
#define N 1123456
long long n,m;
long long flag,sum,ave,ans,res,len,ans1,ans2;
bool mark[N];
int pri[N],cnt;
void SP()
{
cnt=0;
memset(mark,true,sizeof(mark));
mark[0]=mark[1]=false;
for(int i=2;i<N;i++)
{
if(mark[i])
pri[cnt++]=i;
for (int j=0;(j<cnt)&&(i*pri[j]<N);j++)
{
mark[i*pri[j]]=false;
if (i%pri[j]==0)
break;
}
}
}
int main()
{
long long i,j,k,kk,t,x,y,z;
SP();
scanf("%lld",&k);
kk=0;
while(k--)
{
scanf("%lld%lld",&n,&m);
sum=0;
if(m<sqrt(n)&&n)
{
sum=1;t=n;
for(i=0;i<cnt&&pri[i]<=t;i++)
{
res=0;
while(t%pri[i]==0&&t)t/=pri[i],res++;
sum*=(res+1);
}
if(t>1)
sum*=2;
sum=sum/2;
for(i=1;i<m;i++)
if(n%i==0)
sum--;
}
printf("Case %lld: %lld\n",++kk,sum);
}
return 0;
}