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 }


浙公网安备 33010602011771号