-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathp074.cpp
99 lines (82 loc) · 1.92 KB
/
p074.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Digit factorial chains
//
// https://projecteuler.net/problem=74
// https://www.hackerrank.com/contests/projecteuler/challenges/euler074
#include <vector>
#include <set>
#include <iostream>
const unsigned fact10[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
unsigned sum_fact_digits(unsigned n)
{
unsigned sum = 0;
do {
sum += fact10[n % 10];
n /= 10;
} while (n != 0);
return sum;
}
int main()
{
unsigned nb = 0;
std::vector<unsigned char> lengths(4000000, 0);
// cas spéciaux des boucles
lengths[169] = 3;
lengths[1454] = 3;
lengths[363601] = 3;
lengths[871] = 2;
lengths[872] = 2;
lengths[45361] = 2;
lengths[45362] = 2;
for (unsigned n = 0; n < 1000000; ++n)
{
std::set<unsigned> visited;
unsigned i = n;
unsigned k = 0;
while (visited.count(i) == 0)
{
if (i >= 4000000) exit(2);
if (lengths[i] != 0)
{
k += lengths[i];
break;
}
k++;
visited.insert(i);
i = sum_fact_digits(i);
//if (i == n) std::cout << "LOOP " << n << " " << k << std::endl;
}
if (k == 60)
{
nb++;
}
if (k > 250) exit(2);
lengths[n] = (unsigned char) k;
}
if (true)
{
std::cout << nb << std::endl;
}
else
{
unsigned T;
std::cin >> T;
while (T--)
{
unsigned N, L;
bool found = false;
std::cin >> N >> L;
for (unsigned i = 0; i <= N; ++i)
{
if (lengths[i] == L)
{
std::cout << i << " ";
found = true;
}
}
if (! found)
std::cout << "-1";
std::cout << std::endl;
}
}
return 0;
}