题目
思路
这道题目如果要是暴力一个一个找的话肯定会超时,所以我们对a进行质因数分解有
所以a的所有因数的个数就是
最后我们在对这个结果除以2(向下取整,因为不是方形的毯子),然后我们让结果减去大于等于1小于b的数中能整除a的个数,就可以了。(如果b*b>=a的话就直接输出0)。
题解
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int MAXN=1100000;
int prime[MAXN+1];
void getPrime(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++){
if(!prime[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
long long factor[1100000][2];
long long fatCnt;
long long ans;
long long getFactors(long long x){
fatCnt=0;
ans=1;
long long tmp=x;
for(int i=1;prime[i]<=tmp/prime[i];i++){
factor[fatCnt][1]=0;
if(tmp%prime[i]==0){
factor[fatCnt][0]=prime[i];
while(tmp%prime[i]==0){
factor[fatCnt][1]++;
tmp/=prime[i];
}
ans*=(factor[fatCnt][1]+1);
fatCnt++;
}
}
if(tmp!=1){
factor[fatCnt][0]=tmp;
factor[fatCnt++][1]=1;
ans*=(2);
}
return ans;
}
int main()
{
getPrime();
int t;
scanf("%d",&t);
long long cnt=1;
while(t--)
{
long long a,b;
scanf("%lld %lld",&a,&b);
long long ans=0;
if(b*b>=a)
{
printf("Case %lld: 0\n",cnt);
}
else
{
long long num=getFactors(a);
num>>=1;
for(int i=1;i<b;i++)
{
if(a%i==0)
{
num--;
}
}
printf("Case %lld: %lld\n",cnt,num);
}
cnt++;
}
return 0;
}