分数分解

题目描述
给定n(2≤n≤10^9)值,要求x、y均为正整数,且 x < y,并且满足1/x+1/y=1/n. 编程统计有多少对这样的x和y。

输入格式
一个整数n。

输出格式
一个整数,表示相应的方法数是多少。


第一步化简式子嘛, n( x+y ) = xy,反正看到这里我是什么冲动都没有,但是题解很巧妙:两边同时加上 n^2再移项,得 n^2 = n^2 - n( x+y ) + xy ;这次熟悉一点了,因式分解得, n^2 = ( n-x )( n-y )。这意味着什么呢?n-x 为 n^2 的一个因子,而 n 是固定的,也就是说,每一种 n^2 = ab (a < b) 的因数拆解方式都对应了一组 x,y 的取值。我们并不在意 x,y 具体是多少。那么直接开搞就可以了。

另外,这里求约数个数要用到算术基本定理的推论:
这里写图片描述
定理性的证明之后有空整理出来单写。

细节见code:

#include<bits/stdc++.h>
using namespace std;

int k;
int ans;
int pri_[10000];
int cnt;

inline void read(int &x)
{
    x=0;int f=1;char s=getchar();
    for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=(x<<3)+(x<<1)+s-48;
}

void divide_()
{
    memset(pri_,0,sizeof(pri_));
    cnt=0;
    for(int i=2;i*i<=k;++i)
        if(!(k%i)){
            ++cnt;
            while(!(k%i)) k/=i,++pri_[cnt]; 
        }
    if(k!=1) pri_[++cnt]=1;
}

int main()
{
    read(k);
    divide_();//预处理出n的质因子表达式。
    ans=1;
    for(int i=1;i<=cnt;++i) ans*=(pri_[i]*2+1);//因为要用n^2的质因子表达式,所以每个质因子指数都乘以二。
    printf("%d",ans>>1);//n^2=ab;n^2=ba;两者重复计算了,故除以二。n^2=n*n,但是x,y不允许相同,(n-a),(n-b)也不能相同,这种情况不可取,但是不要紧,我们向下取整了。
    return 0;
}

=o=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值