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; }