您的位置:首页 > 其它

LightOJ 1341 Aladdin and the Flying Carpet

2015-09-30 16:23 375 查看

题意:

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
;
int pri
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: