hdu 1299

题意:
求方程1/x+1/y=1/n的解的个数 1/3+1/2 与1/2+1/3看作是一组解。
分析:
 x,y地位是等价的,且都大于n.
      1/x+1/y = 1/n 设y = n + k;
==>1/x + 1/(n+k)=1/n;
==>x = n^2/k + n;
因为x为整数,k就是n^2的约数。然后对其素因子分解就可以了
由于x,y可以相等,所以结果一定为奇数,去重后的结果为加1再除2.
任何一个正整数都可以表示成素数的x次方之积,所以本题就被转化成了求n ^2的素因子个数;

  先把n分解得到 n = p1^e1 * p2^e2 * ......*pr^er 其中p是< n 的素数那么n 的素因子, 则n的因子个数 k = (e1 + 1) * (e2 + 1) * (e3 + 1)*......

  所以:n ^2的因子数是k = (2*e1+1) * (2*e2+1)* (2*e3+1)......

代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int num[1000];
int pre[1000];
int fenjie(int n)
{
 memset(num,0,sizeof(num));
 int count=0,hehe;
 for(int i=2;i*i<=n;i++)
 {
  if(n%i==0)
  {
   while(n%i==0)
   {
    num[count]++;
    n=n/i;
   }
   count++;
  }
 }
 hehe=1;
 if(n>1)
 {
  num[count]=1;
  for(int i=0;i<=count;i++)
   {
    hehe=hehe*(2*num[i]+1);
   }
 }
 else
 {
  for(int i=0;i<=count-1;i++)
   {
    hehe=hehe*(2*num[i]+1);
   }
 }
 return hehe;
}
int main()
{
    int t,n,num;
    while(cin>>t)
    {
     for(int i=1;i<=t;i++)
     {
      cin>>n;
      fenjie(n);
      num=fenjie(n);
      printf("Scenario #%d:\n",i);
      printf("%d\n",(num+1)/2);
      printf("\n");
     }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值