poj 3604 Professor Ben

本文深入探讨了一种高效优化的质因数分解算法,通过精简代码和算法优化,实现了在有限时间内解决大规模质因数分解问题的目标。重点介绍了关键步骤和优化策略,旨在提升算法效率,使其运行速度低于1000ms。通过实例分析和代码展示,读者可以了解到如何在实际应用中实现快速、高效的质因数分解,对于提高计算性能具有重要意义。
摘要由CSDN通过智能技术生成

  继续分解质因数....我想知道那些不到1000ms的代码是怎样写出来的??我的运行了2641ms才过的...

 

View Code
 1   #include <cstdio>
 2   #include <cstring>
 3   #include <cstdlib>
 4   #include <cmath>
 5   #include <algorithm>
 6   #include <iostream>
 7 
 8   #define debug 0
 9 
10   using namespace std;
11 
12   typedef long long ll;
13   const int maxn = 5000001;
14 
15   bool np[maxn];
16   ll pn, pr[maxn >> 2];
17 
18   void gp(){
19       memset(np, 0, sizeof(np));
20       np[0] = np[1] = true;
21       pn = 0;
22       for (ll i = 2; i < maxn; i++){
23           if (!np[i]) pr[pn++] = i;
24           for (int j = 0; j < pn && pr[j] * i < maxn; j++){
25               np[pr[j] * i] = true;
26               if (i % pr[j] == 0) break;
27           }
28       }
29       #if debug
30       cout << "pn  " << pn << endl;
31       #endif
32   }
33 
34   void fac(ll a, int *f, int &cnt){
35       int i = 0;
36 
37       cnt = 0;
38       while (pr[i] * pr[i] <= a && i < pn){
39           while (a % pr[i] == 0){
40               f[cnt++] = pr[i];
41               a /= pr[i];
42           }
43           i++;
44       }
45       if (a != 1) f[cnt++] = a;
46   }
47 
48   void deal(ll a){
49       int f[50], tmp;
50       int ans = 1;
51       int cnt = 0;
52       int n = 0;
53 
54       if (!np[a]) {
55         printf("9\n");
56         return ;
57       }
58       memset(f, 0, sizeof(f));
59       fac(a, f, n);
60       sort(f, f + n);
61       #if debug
62       cout << "n  " << n << endl;
63       for (int i = 0; i < n; i++){
64           cout << f[i] << endl;
65       }
66       f[n] = 0;
67       #endif
68       for (int i = 0; i < n; i++){
69           cnt++;
70           if (f[i] != f[i + 1]) {
71               #if debug
72               cout << "cnt " << cnt << endl;
73               #endif
74               tmp = (cnt + 1) * (cnt + 2) >> 1;
75               tmp *= tmp;
76               ans *= tmp;
77               cnt = 0;
78           }
79           if (!ans) break;
80       }
81       printf("%d\n", ans);
82   }
83 
84   int main(){
85       int a, n;
86 
87       gp();
88       scanf("%d", &n);
89       while (n-- && ~scanf("%d", &a)){
90           deal(a);
91       }
92 
93       return 0;
94   }

 

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/08/05/poj_3604_Lyon.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值