F(X)

题目描述:


我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数。现在给你一个n,你需要求出 F(n) 输入格式: 多组数据,每组第一行有一个整数n, 0 < n <= 10^11。 输出格式: 每组输出一行,满足条件的(a,b)对数

分析:从题目可以看出,所输入的X必须要同时整除a和b,那么我们求出X%a==0时的c=X/a,然后得出d=c/b。那么从这里可以看出,这时候的c和d都满足公式 x mod (c*d)==0,由此可得,c和d都是X的因子。由于n最大可达10^11次方,因此我们将a的范围设为1<=a<=sqrt(n)+1,循环的范围知识sqrt(n),由此可知,时间复杂度降了很多很多。最后我们求出这范围内的因子,去掉重复的因子,然后一个个枚举比较就可以得出最终个数。自己看代码吧!

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
long long arr[100000];
int main()
{
    long long n,a,b,temp,cnt,m;
    int i,j,k;
    while(scanf("%lld",&n)!=EOF)
    {
        i=0;cnt=0;
        memset(arr,0,sizeof(arr));
        m=sqrt(n)+1;
        for(a=1;a<m;a++)
        {
            temp=n%a;
            if(temp==0)
            {
                temp=n/a;
                arr[i]=a;
                i=i+1;
                if(a!=temp)  
                {
                    arr[i]=temp;
                    i=i+1; 
                }
            }
        }
        //printf("%d\n",i);
        for(j=0;j<i;j++)
        {
            //printf("%lld ",arr[j]);
            for(k=0;k<i;k++)// && arr[a]*arr[b]<=n
            {
                //printf("%ld*%ld:%ld\n",arr[a],arr[b],n%(arr[a]*arr[b]));
                if(n%(arr[j]*arr[k])==0)
                {
                   cnt=cnt+1;;    
                }
            }
        }
        printf("%lld\n",cnt);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值