其实这个方法跟直接暴力(从n到sqrt(n))有区别?就硬出题
数据把sqrt(q)<<<<<<<<<n 所以原本数据均匀下相等的情况,效率一样的方法,在这里有了区别
性质:约数个数等于质因子次数+1的累成
const int N=1e6+5;
int pp[N];//标记用的
ll p[N];//保存质数用的
ll n,q;
ll k;
void init(){//把质数保存下来
k=0;
memset(pp,0,sizeof pp);
pp[0]=pp[1]=1;
for(ll i=2;i<N;i++){
if(!pp[i]){
p[k++]=i;
for(ll j=i*i;j<N;j+=i)
pp[j]=1;
}
}
}
ll ppp(){//求质因数个数的模板
ll res=1;
for(ll i=0;p[i]*p[i]<=n&&i<k;i++){
ll cot=0;
if(n%p[i]==0){
while(n%p[i]==0){
cot++;
n/=p[i];
}
res*=(cot+1);
}
}
if(n>1)res=res*2;
return res;
}
int main()
{
int t;
int kk=1;
cin>>t;
init();//记得不要忘了。。。
while(t--){
cin>>n>>q;
ll nn=n;
if(q*q>=n){//特判一下,不满足的话直接输出0
printf("Case %d: 0\n",kk++);
continue;
}
else{
ll ans=ppp();//求出有多少个因子
ans/=2;//因为是长方形,有一半是重复的所以要除以2,就算有n^(1/2),这个值,它也是不满足的(因为需要是长方形),所以除以2取整是对的。
for(ll i=1;i<q;i++){
if(nn%i==0)ans--;//去掉最小边小于题目给的最小长度。
}
printf("Case %d: %lld\n",kk++,ans);//输出结果
}
}
return 0;
}