• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

╰☆惔、煙菋

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

HDU_1299 Diophantus of Alexandria

整数分解:

  任何一个正整数都可以表示成素数的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,这样做得到的结果是题目要求的2倍

#include <stdio.h>
#include
<math.h>
#define max 50000
int num[max], prim[max];
int main()
{
int t, n, i, j, cnt, a, m, pim;
m
= 0;
for (i = 1; i < max; ++ i)
{
num[i]
= 1;
}
for (i = 2; i < max; ++ i) //筛素数
{
if (num[i])
{
prim[m
++] = i;
for (j = i+i; j < max; j += i)
{
num[j]
= 0;
}
}
}
scanf(
"%d", &t);
for (i = 1; i <= t; ++ i)
{
scanf(
"%d", &n);
cnt
= 1;
for (j = 0; j < m; ++ j)
{
pim
= (int) sqrt(n*1.0) + 1;
if (prim[j] > pim)
{
break;
}
a
= 0;
while (n % prim[j] == 0)
{
a
++;
n
/= prim[j];
}
cnt
*= (1 + 2 * a);
}
if (n > 1) //当n是素数的时候
{
cnt
*= 3;
}
printf(
"Scenario #%d:\n", i);
printf(
"%d\n", (cnt+1)/2);
printf(
"\n");
}
return 0;
}

posted on 2011-04-02 14:42  ╰☆惔、煙菋  阅读(997)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3