#include <bits/stdc++.h>
using namespace std;
long long n, ti[102], t[102][102], k, k2, dp[102][30], pot[102][30];
long long find_dp(int i)
{
long long fdp = 0;
for (int it = 0; it < 30; ++it)
{
fdp += dp[i][it] * pot[ti[i]][it];
}
return fdp;
}
void multi(int i)
{
for (int it = 0; it < 30; ++it)
{
dp[i][it] *= k2;
}
for (int it = 0; it < 30; ++it)
{
dp[i][it + 1] += dp[i][it] / 1000000;
dp[i][it] %= 1000000;
}
}
void push_dp(int i, int j)
{
long long a = 0;
for (int it = 29; it >= 0; --it)
{
dp[j][it] += (dp[i][it] + a) / ti[i];
dp[j][it + 1] += dp[j][it] / 1000000;
dp[j][it] %= 1000000;
long long a2 = (a + dp[i][it]) % ti[i];
a = a2 * 1000000;
}
}
int main()
{
for (int i = 2; i <= 100; ++i)
{
pot[i][1] = 1000000 % i;
pot[i][0] = 1;
}
for (int i = 2; i <= 100; ++i)
{
for (int it = 2; it < 30; ++it)
{
pot[i][it] = pot[i][it - 1] * pot[i][1];
pot[i][it] %= i;
}
}
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &ti[i]);
for (int j = 0; j < ti[i]; ++j)
{
scanf("%d", &t[i][j]);
}
}
if (ti[1] == 0)
{
printf("1");
return 0;
}
dp[0][0] = ti[1];
dp[1][0] = ti[1];
for (int i = 1; i <= n; ++i)
{
if (ti[i] == 0)
continue;
long long mod_dp = find_dp(i) % ti[i];
//cout << dp[i][0] << ' ' << dp[i][1] << ' ' << dp[i][2] << endl;
//cout << mod_dp << ' ' << ti[i] << endl;
if (mod_dp != 0)
{
k2 = ti[i] / __gcd(mod_dp, ti[i]);
for (int j = i; j <= n; ++j)
{
multi(j);
}
multi(0);
}
for (int j = 0; j < ti[i]; ++j)
{
push_dp(i, t[i][j]);
}
}
int it = 29;
while (dp[0][it] == 0)
--it;
printf("%d", dp[0][it]);
while (it > 0)
{
--it;
int it2 = -1;
while (dp[0][it] >= pow(10, it2 + 1))
++it2;
it2 = 5 - it2;
for (int i = 0; i < it2; ++i)
printf("0");
if (dp[0][it] != 0)
printf("%d", dp[0][it]);
}
return 0;
}
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 100 101 102 103 104 105 106 | #include <bits/stdc++.h> using namespace std; long long n, ti[102], t[102][102], k, k2, dp[102][30], pot[102][30]; long long find_dp(int i) { long long fdp = 0; for (int it = 0; it < 30; ++it) { fdp += dp[i][it] * pot[ti[i]][it]; } return fdp; } void multi(int i) { for (int it = 0; it < 30; ++it) { dp[i][it] *= k2; } for (int it = 0; it < 30; ++it) { dp[i][it + 1] += dp[i][it] / 1000000; dp[i][it] %= 1000000; } } void push_dp(int i, int j) { long long a = 0; for (int it = 29; it >= 0; --it) { dp[j][it] += (dp[i][it] + a) / ti[i]; dp[j][it + 1] += dp[j][it] / 1000000; dp[j][it] %= 1000000; long long a2 = (a + dp[i][it]) % ti[i]; a = a2 * 1000000; } } int main() { for (int i = 2; i <= 100; ++i) { pot[i][1] = 1000000 % i; pot[i][0] = 1; } for (int i = 2; i <= 100; ++i) { for (int it = 2; it < 30; ++it) { pot[i][it] = pot[i][it - 1] * pot[i][1]; pot[i][it] %= i; } } scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &ti[i]); for (int j = 0; j < ti[i]; ++j) { scanf("%d", &t[i][j]); } } if (ti[1] == 0) { printf("1"); return 0; } dp[0][0] = ti[1]; dp[1][0] = ti[1]; for (int i = 1; i <= n; ++i) { if (ti[i] == 0) continue; long long mod_dp = find_dp(i) % ti[i]; //cout << dp[i][0] << ' ' << dp[i][1] << ' ' << dp[i][2] << endl; //cout << mod_dp << ' ' << ti[i] << endl; if (mod_dp != 0) { k2 = ti[i] / __gcd(mod_dp, ti[i]); for (int j = i; j <= n; ++j) { multi(j); } multi(0); } for (int j = 0; j < ti[i]; ++j) { push_dp(i, t[i][j]); } } int it = 29; while (dp[0][it] == 0) --it; printf("%d", dp[0][it]); while (it > 0) { --it; int it2 = -1; while (dp[0][it] >= pow(10, it2 + 1)) ++it2; it2 = 5 - it2; for (int i = 0; i < it2; ++i) printf("0"); if (dp[0][it] != 0) printf("%d", dp[0][it]); } return 0; } |
English