Submission #00073


ソースコード

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.IO;
using System.Text;
using System.Diagnostics;
using Binary = System.Func<System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.BinaryExpression>;
using Unary = System.Func<System.Linq.Expressions.ParameterExpression, System.Linq.Expressions.UnaryExpression>;
class Program
{
static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
static Scan sc = new Scan();
const int M = 1000000007;
const double eps = 1e-11;
static readonly int[] dd = { 0, 1, 0, -1, 0 };
static void Main()
{
int n = sc.Int;
var kaijo = new long[n + 1];
kaijo[0] = 1;
for (int i = 1; i <= n; i++)
{
kaijo[i] = kaijo[i - 1] * i % M;
}
var dic = new SortedDictionary<int, int>[10];
for (int i = 0; i < 10; i++)
{
dic[i] = new SortedDictionary<int, int>();
}
var vis = new bool[10];
for (int i = 0; i < n; i++)
{
int a, b;
sc.Multi(out a, out b);
vis[a] = true;
if (dic[a].ContainsKey(b))
++dic[a][b];
else
dic[a].Add(b, 1);
}
int ccc = 0;
for (int i = 0; i < 10; i++)
{
if (vis[i])
++ccc;
}
if (ccc == 1)
{
long keta = 0;
int nn = -1;
for (int i = 0; i < 10; ++i)
{
foreach (var item in dic[i])
{
nn = i;
keta += item.Key * (long)item.Value;
}
}
DBG(op(keta) * nn % M);
DBG(kaijo[n]);
return;
}
long ans = 0, cnt = 1;
int fir = -1, firk = 0;
for (int i = 1; i < 10; i++)
{
if (dic[i].Count > 0)
{
fir = i;
foreach (var item in dic[i])
{
cnt *= item.Value;
firk = item.Key;
ans = op(firk) * i % M;
break;
}
break;
}
}
for (int i = 0; i < 10; i++)
{
long keta = 0;
int cc = 0;
foreach (var item in dic[i])
{
keta += item.Key * (long)item.Value;
cc += item.Value;
}
if (i == fir)
{
keta -= firk;
--cc;
}
ans = (ans * mymath.pow(10, keta) % M + op(keta) * i % M) % M;
cnt = cnt * kaijo[cc] % M;
}
Prt(ans);
Prt(cnt);
sw.Flush();
}
// 111...111(n keta) % M
static long op(long a)
{
if (a == 0) return 0;
long p = op(a / 2);
if (a % 2 == 0) return (p * mymath.pow(10, a / 2) % M + p) % M;
else return (p * mymath.pow(10, a / 2 + 1) % M + p * 10 % M + 1) % M;
}
static void swap<T>(ref T a, ref T b) { var t = a; a = b; b = t; }
static T Max<T>(params T[] a) { return a.Max(); }
static T Min<T>(params T[] a) { return a.Min(); }
static void DBG(string a) { Console.WriteLine(a); }
static void DBG<T>(IEnumerable<T> a) { Console.WriteLine(string.Join(" ", a)); }
static void DBG(params object[] a) { Console.WriteLine(string.Join(" ", a)); }
static void Prt(string a) { sw.WriteLine(a); }
static void Prt<T>(IEnumerable<T> a) { sw.WriteLine(string.Join(" ", a)); }
static void Prt(params object[] a) { sw.WriteLine(string.Join(" ", a)); }
}
static class ex
{
public static void swap<T>(this IList<T> a, int i, int j) { var t = a[i]; a[i] = a[j]; a[j] = t; }
public static T[] copy<T>(this IList<T> a)
{
var ret = new T[a.Count];
for (int i = 0; i < a.Count; i++) ret[i] = a[i];
return ret;
}
}
static class Operator<T>
{
static readonly ParameterExpression x = Expression.Parameter(typeof(T), "x");
static readonly ParameterExpression y = Expression.Parameter(typeof(T), "y");
public static readonly Func<T, T, T> Add = Lambda(Expression.Add);
public static readonly Func<T, T, T> Subtract = Lambda(Expression.Subtract);
public static readonly Func<T, T, T> Multiply = Lambda(Expression.Multiply);
public static readonly Func<T, T, T> Divide = Lambda(Expression.Divide);
public static readonly Func<T, T> Plus = Lambda(Expression.UnaryPlus);
public static readonly Func<T, T> Negate = Lambda(Expression.Negate);
public static Func<T, T, T> Lambda(Binary op) { return Expression.Lambda<Func<T, T, T>>(op(x, y), x, y).Compile(); }
public static Func<T, T> Lambda(Unary op) { return Expression.Lambda<Func<T, T>>(op(x), x).Compile(); }
}
class Scan
{
public int Int { get { return int.Parse(Str); } }
public long Long { get { return long.Parse(Str); } }
public double Double { get { return double.Parse(Str); } }
public string Str { get { return Console.ReadLine().Trim(); } }
public int[] IntArr { get { return StrArr.Select(int.Parse).ToArray(); } }
public long[] LongArr { get { return StrArr.Select(long.Parse).ToArray(); } }
public double[] DoubleArr { get { return StrArr.Select(double.Parse).ToArray(); } }
public string[] StrArr { get { return Str.Split(); } }
bool eq<T, U>() { return typeof(T).Equals(typeof(U)); }
T ct<T, U>(U a) { return (T)Convert.ChangeType(a, typeof(T)); }
T cv<T>(string s) { return eq<T, int>() ? ct<T, int>(int.Parse(s))
: eq<T, long>() ? ct<T, long>(long.Parse(s))
: eq<T, double>() ? ct<T, double>(double.Parse(s))
: eq<T, char>() ? ct<T, char>(s[0])
: ct<T, string>(s); }
public void Multi<T>(out T a) { a = cv<T>(Str); }
public void Multi<T, U>(out T a, out U b)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); }
public void Multi<T, U, V>(out T a, out U b, out V c)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); }
public void Multi<T, U, V, W>(out T a, out U b, out V c, out W d)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); }
public void Multi<T, U, V, W, X>(out T a, out U b, out V c, out W d, out X e)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); }
public void Multi<T, U, V, W, X, Y>(out T a, out U b, out V c, out W d, out X e, out Y f)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); f = cv<Y>(ar[5]); }
public void Multi<T, U, V, W, X, Y, Z>(out T a, out U b, out V c, out W d, out X e, out Y f, out Z g)
{ var ar = StrArr; a = cv<T>(ar[0]); b = cv<U>(ar[1]); c = cv<V>(ar[2]); d = cv<W>(ar[3]); e = cv<X>(ar[4]); f = cv<Y>(ar[5]); g = cv<Z>(ar[6]);}
}
class mymath
{
public static long Mod = 1000000007;
public static bool isprime(long a)
{
if (a < 2) return false;
for (long i = 2; i * i <= a; i++) if (a % i == 0) return false;
return true;
}
public static bool[] sieve(int n)
{
var p = new bool[n + 1];
for (int i = 2; i <= n; i++) p[i] = true;
for (int i = 2; i * i <= n; i++) if (p[i]) for (int j = i * i; j <= n; j += i) p[j] = false;
return p;
}
public static List<int> getprimes(int n)
{
var prs = new List<int>();
var p = sieve(n);
for (int i = 2; i <= n; i++) if (p[i]) prs.Add(i);
return prs;
}
public static long[][] E(int n)
{
var ret = new long[n][];
for (int i = 0; i < n; i++) { ret[i] = new long[n]; ret[i][i] = 1; }
return ret;
}
public static long[][] pow(long[][] A, long n)
{
if (n == 0) return E(A.Length);
var t = pow(A, n / 2);
if ((n & 1) == 0) return mul(t, t);
return mul(mul(t, t), A);
}
public static double dot(double[] x, double[] y)
{
int n = x.Length;
double ret = 0;
for (int i = 0; i < n; i++) ret += x[i] * y[i];
return ret;
}
public static long dot(long[] x, long[] y)
{
int n = x.Length;
long ret = 0;
for (int i = 0; i < n; i++) ret = (ret + x[i] * y[i]) % Mod;
return ret;
}
public static T[][] trans<T>(T[][] A)
{
int n = A[0].Length, m = A.Length;
var ret = new T[n][];
for (int i = 0; i < n; i++) { ret[i] = new T[m]; for (int j = 0; j < m; j++) ret[i][j] = A[j][i]; }
return ret;
}
public static double[] mul(double[][] A, double[] x)
{
int n = A.Length;
var ret = new double[n];
for (int i = 0; i < n; i++) ret[i] = dot(x, A[i]);
return ret;
}
public static long[] mul(long[][] A, long[] x)
{
int n = A.Length;
var ret = new long[n];
for (int i = 0; i < n; i++) ret[i] = dot(x, A[i]);
return ret;
}
public static long[][] mul(long[][] A, long[][] B)
{
int n = A.Length;
var Bt = trans(B);
var ret = new long[n][];
for (int i = 0; i < n; i++) ret[i] = mul(Bt, A[i]);
return ret;
}
public static long[] add(long[] x, long[] y)
{
int n = x.Length;
var ret = new long[n];
for (int i = 0; i < n; i++) ret[i] = (x[i] + y[i]) % Mod;
return ret;
}
public static long[][] add(long[][] A, long[][] B)
{
int n = A.Length;
var ret = new long[n][];
for (int i = 0; i < n; i++) ret[i] = add(A[i], B[i]);
return ret;
}
public static long pow(long a, long b)
{
if (a >= Mod) return pow(a % Mod, b);
if (a == 0) return 0;
if (b == 0) return 1;
var t = pow(a, b / 2);
if ((b & 1) == 0) return t * t % Mod;
return t * t % Mod * a % Mod;
}
public static long inv(long a) { return pow(a, Mod - 2); }
public static long gcd(long a, long b)
{
while (b > 0) { var t = a % b; a = b; b = t; }
return a;
}
// a x + b y = gcd(a, b)
public static long extgcd(long a, long b, out long x, out long y)
{
long g = a; x = 1; y = 0;
if (b > 0) { g = extgcd(b, a % b, out y, out x); y -= a / b * x; }
return g;
}
public static long lcm(long a, long b) { return a / gcd(a, b) * b; }
public static long comb(int n, int r)
{
if (n < 0 || r < 0 || r > n) return 0;
if (n - r < r) r = n - r;
if (r == 0) return 1;
if (r == 1) return n;
int[] numer = new int[r], denom = new int[r];
for (int k = 0; k < r; k++) { numer[k] = n - r + k + 1; denom[k] = k + 1; }
for (int p = 2; p <= r; p++)
{
int piv = denom[p - 1];
if (piv > 1)
{
int ofst = (n - r) % p;
for (int k = p - 1; k < r; k += p) { numer[k - ofst] /= piv; denom[k] /= piv; }
}
}
long ret = 1;
for (int k = 0; k < r; k++) if (numer[k] > 1) ret = ret * numer[k] % Mod;
return ret;
}
}

ステータス

項目 データ
問題 0003 - repdigit
ユーザー名 rian
投稿日時 2017-07-07 20:47:44
言語 C#
状態 Wrong Answer
得点 0
ソースコード長 11777 Byte
最大実行時間 188 ms
最大メモリ使用量 21352 KB

セット

セット 得点 Cases
1 ALL 0 / 100 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
01_sample1.in AC 49 ms 9684 KB
1
01_sample2.in AC 43 ms 9748 KB
1
01_sample3.in AC 42 ms 9676 KB
1
02_handmake1.in AC 42 ms 11784 KB
1
02_handmake2.in AC 44 ms 11844 KB
1
02_handmake3.in AC 48 ms 9616 KB
1
02_handmake4.in AC 44 ms 9680 KB
1
02_handmake5.in AC 51 ms 7744 KB
1
02_handmake6.in AC 47 ms 9728 KB
1
02_handmake7.in AC 50 ms 11840 KB
1
02_handmake8.in AC 48 ms 9852 KB
1
02_handmake9.in AC 43 ms 11832 KB
1
03_random1.in AC 45 ms 9852 KB
1
03_random2.in AC 44 ms 11832 KB
1
03_random3.in AC 47 ms 9720 KB
1
03_random4.in AC 44 ms 9784 KB
1
03_random5.in AC 43 ms 9840 KB
1
03_random6.in AC 46 ms 9904 KB
1
04_random1.in AC 47 ms 9836 KB
1
04_random2.in AC 42 ms 11808 KB
1
04_random3.in AC 44 ms 9808 KB
1
04_random4.in WA 46 ms 9868 KB
1
04_random5.in WA 47 ms 12024 KB
1
04_random6.in WA 46 ms 9932 KB
1
05_random1.in AC 171 ms 21188 KB
1
05_random2.in AC 166 ms 19196 KB
1
05_random3.in AC 162 ms 21352 KB
1
05_random4.in AC 172 ms 21268 KB
1
06_random1.in AC 188 ms 21172 KB
1
06_random3.in AC 178 ms 19212 KB
1