12119 - The Bells are Ringing

按照N的小于1000000的因子枚举就是了;

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<vector>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 const int maxn = 1000000 + 10;
 9 
10 typedef long long ll;
11 ll prime[maxn], plen;
12 bool vis[maxn];
13 
14 void mklist() {
15     memset(vis, 0, sizeof(vis));
16     plen = 0;
17     for(int i = 2; i * i < maxn; ++i) {
18         if(!vis[i]) {
19             for(int j = i; j * i < maxn; ++j) {
20                 vis[i * j] = true;
21             }
22         }
23     }
24     for(int i = 2; i < maxn; ++i) if(!vis[i]) prime[plen++] = i;
25 }
26 
27 ll fac[100][2], flen;
28 void split(ll n) {
29     flen = 0;
30     for(int i = 0; i < plen && prime[i] <= n; ++i) {
31         if(n % prime[i] == 0) {
32             fac[flen][0] = prime[i];
33             fac[flen][1] = 0;
34             while(n % prime[i] == 0) {
35                 n /= prime[i];
36                 ++fac[flen][1];
37             }
38             ++flen;
39         }
40     }
41     if(n > 1 && n < 1000000) {
42         fac[flen][0] = n;
43         fac[flen][1] = 1;
44         ++flen;
45     }
46 }
47 
48 ll gcd(ll a, ll b) {
49     return b ? gcd(b, a % b) : a;
50 }
51 
52 ll lcm(ll a, ll b) {
53     return a / gcd(a, b) * b;
54 }
55 
56 vector<ll>f;
57 
58 void dfs(int d, ll sum) {
59     if(d == flen) {
60         f.push_back(sum);
61         return ;
62     }
63     ll t = 1;
64     for(int i = 0; i <= fac[d][1]; ++i) {
65         if(sum * t > 1000000) break; 
66         dfs(d + 1, sum * t);
67         t *= fac[d][0];
68     }
69 }
70 
71 int main() {
72     mklist();
73     int kase = 0;
74     ll n;
75     while(cin >> n && n) {
76         split(n);
77         f.clear();
78         dfs(0,1);
79         sort(f.begin(), f.end());
80         cout << "Scenario " << ++kase << ":" << endl;
81         bool flg = false;
82         for(int i = 0; i < f.size(); ++i) {
83             for(int j = i + 1; j < f.size() && f[i] + 25 >= f[j]; ++j) {
84                 for(int k = j + 1; k < f.size() && f[i] + 25 >= f[k]; ++k) {
85                     if(lcm(lcm(f[i],f[j]), f[k]) == n) {
86                         flg = true;
87                         cout << f[i] << " " << f[j] << " " << f[k] << endl;
88                     }
89                 }
90             }
91         }
92         if(!flg) cout << "Such bells don't exist" << endl;
93         cout << endl;
94     }
95     return 0;
96 }

 

posted @ 2013-01-30 20:22  ACSeed  Views(117)  Comments(0)    收藏  举报