题意:一个面积,给定最小长度,求不重复乘积组数。
算术基本定理(唯一分解定理):一个数可以分解为多个质数的幂。
其正因数个数为
给出数据为a ,b
然后直接算a的正因数个数除于2,再减去b的乘积组数 这样就可以算出 (b,a]区间的对数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
bool isprime[maxn];
int prime[maxn];
int pcnt=0;
void init()
{
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1];
for(int i=2;i<maxn;i++)
{
if(isprime[i])
{
prime[pcnt++]=i;
for(int j=i;j<maxn;j+=i)
{
isprime[j]=0;
}
}
}
//for(int i=0;i<15;i++) cout<<prime[i]<<endl;
}
ll uni_resolve(ll num)
{
if(num==0) return 0;
int cnt=0;
ll ans=1;
int i=0;
while(prime[i]<=num&&pcnt>i)
{
cnt=0;
if(num%prime[i]==0)
{
while(num%prime[i]==0)
{
cnt++;
num/=prime[i];
}
}
ans*=cnt+1;
i++;
}
if(num>1) ans*=2;
//cout<<"a"<<ans<<endl;
return ans;
}
int main()
{
ll a,b;
init();
int t;
scanf("%d",&t);
int ncnt=1;
while(t--)
{
scanf("%lld%lld",&a,&b);
ll ans=0;
ll cnt=0;
if(b>=sqrt(a))//×îС³¤¶ÈҪСÓÚb µÈÓÚb¾ÍÊÇÕý·½ÐÎÁË
{
ans=0;
//cout<<"x";
}
else
{
for(ll i=1;i<b;i++)
{
if(a%i==0)
{
cnt++;//¶ÔÊý
}
}
//cout<<"cnt"<<cnt<<endl;
ll all=uni_resolve(a);
all/=2;
ans=all-cnt;
}
printf("Case %d: %lld\n",ncnt++,ans);;
}
return 0;
}