预处理用埃式筛法打了个素数表。
因为a可能很大,直接暴力求太慢了。
这里用到了质因数分解求a的因子个数,等于
∏
i
=
1
n
(
1
+
c
n
t
p
i
)
\prod_{i=1}^{n}(1+cnt_{p_i})
∏i=1n(1+cntpi)(
p
i
p_i
pi为a的质因数)
对于小于b的因子暴力跑,没想到别的方法。
#include<bits/stdc++.h>
using namespace std;
int n,m;
#define MAXN 1005000
#define ll long long
ll a[MAXN];
ll p[MAXN];
int check[MAXN];
int pcnt=0;
void isprime()
{
for(ll i=2;i<=1000000;i++)
{
if(check[i])continue;
p[++pcnt]=i;
for(ll j=i*i;j<=1000000;j+=i)
check[j]=1;
}
}
int main()
{
isprime();
int t;
cin>>t;
int cas=0;
while(t--)
{
cas++;
ll a,b;
scanf("%lld%lld",&a,&b);
ll cnt=1;
ll x=a;
for(int i=1;i<=pcnt&&x>=p[i]*p[i];i++)
{
ll mul=1;
while(x%p[i]==0)
{
x/=p[i];
mul++;
}
cnt*=mul;
}
if(x>1)cnt*=2ll;
if(b>=sqrt(a)){
printf("Case %d: 0\n",cas);
continue;
}
else
{
for(int i=1;i<b;i++)
if(a%i==0)cnt-=2;
printf("Case %d: %lld\n",cas,cnt/2);
}
}
}