nitacm20301 poor math

题目:给你一个n(1<=n<=1,000,000,000,000 ),找到满足1/n=1/a+1/b(0<a<=b)的数量。

题目链接:https://www.nitacm.com/problem_show.php?pid=20301

题意转换:

①不知道干啥先打表找规律

int n,cnt=0;
cin>>n;
for(int i=1;i<=1000;i++)//枚举a 
{
    for(int j=i;j<=1000;j++)//枚举b
    {
        if(n*(i+j)==i*j)cout<<i<<" "<<j<<endl,cnt++;
    }
}
cout<<cnt<<endl; 

n=6时,cnt=5,分别为(7,42),(8,24),(9,18),(10,15),(12,12)。

顺便打下前20的答案用作验证:

1 2 2 3 2 5 2 4 3 5 2 8 2 5 5 5 2 8 2 8 5

②之后开始推公式

1/n=1/a+1/b
1/n=(a+b)/ab
ab=(a+b)n
ab=an+bn
ab-bn=an
b(a-n)=an
b=an/(a-n)
设i=a-n,即a=i+n
b=(n+i)*n/i
b=n*n/i+n
由题意可知a>n(i>0),已知a<=b(i+n<=n*n/i+n)
同减n,i<=n*n/i
同乘i,i*i<=n*n,
i<=n
至此得到条件i∈[1,n]
又已知a,b为整数,所以n*n/i需要为整除
满足条件的a和b需要满足:i在范围内,n*n/i为整数

题意转换:1到n中有多少个n*n的因子

③d=====( ̄▽ ̄*)b

题意好像十分明了了(就是不会做)。

暴力的复杂度为sqrt(n*n),与欧拉函数找不出关联,题目的突破点在于n*n(平方数的因子),并且求的是因子数,而不是具体哪些因子。

需要一点前导知识:

https://blog.csdn.net/qq_40679299/article/details/80583222

100=2*2*5*5,有(1+2)*(1+2)个因子

50=2*5*5,有(1+1)*(1+2)个因子

54=2*3*3*3,有(1+1)*(1+3)个因子

30=2*3*5,有(1+1)*(1+1)*(1+1)个因子

👇

n*n有多少个因子?

枚举n的所有因子即可,如果n有一个因子2,那么n*n就有两个因子2。

1到n有多少个n*n的因子?

n是sqrt(n*n),倘若n*n在[1,n*n]内有2k+1个因子,n肯定是其第k+1个因子,(2k+1+1)/2=k+1。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,cnt=1,sqrtn;
    while(cin>>n)
    {
        cnt=1;//从1开始乘 
        sqrtn=sqrt(n);
        for(int i=2;i<=sqrtn;i++)
        {
            int tmp=0;
            while(n%i==0)
            {
                n=n/i;
                tmp++;
            }
            if(tmp!=0)cnt*=(tmp*2+1);
            if(i>n)break;
        }
        if(n!=1)cnt*=3;//*(1+2*1) 
        cout<<(cnt+1)/2<<endl;
    }
    return 0;
}
posted @ 2019-11-28 13:39  myrtle  阅读(165)  评论(0编辑  收藏  举报