题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299
题目大意:就是给你一个n,求1/x+//y=1/n正整数解的个数。
思路:首先我们可以在两边同时乘以xyn得yn+xn=xy,然后因式分解的(x-n)*(y-n)=n*n。这题要求解的个数,就变成了求n*n的因子数,网上很多人都是令y=n+k,然后的x=(n*n)/k+n,这儿也是求n*n的因子数。
通过数论的中的学习我们知道任意一个数n都可以由素数表示出来,即:
n=p1^e1*p2^e2*p3*e3*......pn^en 。(p1,p2,p3......pn都为素数)
因子数为:(1+e1)*(1+e2)*(1+e3)*......*(1+en) 所以对 n*n
n*n=p1^2e1*p2^2e2*p3^2e3......pn^2en
因子数为:(1+2*e1)*(1*2*e2)*(1+2*e3)*......*(1+2*en)
所以我们只需要求求出n的素因子。
code:
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int vis[40005]; int prime[40005]; int primetable() { //int m=sqrt(40000+0.5); int c=0; memset(vis,0,sizeof(vis)); for(int i=2;i<=40000;i++) { if(!vis[i]) { prime[c++]=i; for(int j=i*i;j<=40000;j+=i) { vis[j]=1; } } } return c; } int main() { int i,kk=0; int len,T,n,cnt,sum1; len=primetable(); scanf("%d",&T); while(T--) { kk++; cnt=1; scanf("%d",&n); for(i=0;i<len;i++) //计算素因子的个数 { int m=sqrt(n)+1; if(prime[i]>m) break; int sum1=0; while(n%prime[i]==0) { sum1++; n=n/prime[i]; } cnt*=(1+2*sum1); } if(n>1) cnt*=3; //为什么这儿要乘以3,因为前面我们一直在做n/prime[i],但是做到最后不一定n==1,但是这时这个数却不能再被分解啦,所以这个数一定是一个素数,所以要做cnt*(1+2*1) printf("Scenario #%d:\n%d\n\n",kk,(cnt+1)/2); //x与y交换只能算一种,所以要除以2,但是n也是因子之一啊,我们必须加上它做成两个它,再除以二就是了 } return 0; }
时间: 2024-10-14 14:30:35