HDU 1299 求因子个数

来源:互联网 发布:屏幕闪电软件 编辑:程序博客网 时间:2024/04/27 19:47

现在假设 y = n +k (k为正整数) ,
那么带入公式,可以得出 x = (n*(n+k))/k = n*n/k + n; 由于x 是正整数,现在的关键问题就是

要求出 n*n/ k 有多少组正整数的可能,显然,所要求的就是 n*n 因子的个数

整数分解:

  任何一个正整数都可以表示成素数的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)......

这个题还要注意一点就是当n是素数的时候,很显然 k *= 3

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=40000;
int prime[N],p;
bool mark[N];
void init()
{
    int i,j;
 p=0;
 for(i=2;i*i<N;i++)
 {
  if(!mark[i])
  {
   prime[p++]=i;
   for(j=i*i;j<N;j+=i)
   {
    mark[j]=true;
   }
  }
 }
}
int main()
{
 int t,n,i,cas=1,cnt,ans;
 init();
 cin>>t;
 while(t--)
 {
  cin>>n;
  printf("Scenario #%d:\n",cas++);
  ans=1;
  for(i=0;i<p&&n>1;i++)
  {
   if(n%prime[i]==0)
   {
    cnt=1;n/=prime[i];
    while(n%prime[i]==0)
    {
     n/=prime[i];
     cnt++;
    }
    ans*=(2*cnt+1);
   }
  }
  if(n>1) ans*=3;
  printf("%d\n\n",ans/2+1);   //很显然ans为奇数(全是奇数相乘),中间因子为n(只算一种)
 }
 return 0;
}

原创粉丝点击