static object Solve() { var s = Console.ReadLine().Select(c => (long)(c - '0')).ToArray(); var t = Console.ReadLine().Select(c => (long)(c - '0')).ToArray(); var n = s.Length; var m = t.Length; var rsq = new StaticRSQ1(s); var tSum = t.Sum(); var tr = t.Reverse().ToArray(); var conv = FFT.Convolution(s, tr); return(Enumerable.Range(0, n - m + 1).Min(XorSum)); long XorSum(int j) { var r = tSum; r += rsq.GetSum(j, j + m); r -= 2 * conv[j + m - 1]; return(r); } }
static void Main() { var n = int.Parse(Console.ReadLine()); var a = new long[n + 1]; var b = new long[n + 1]; for (int i = 1; i <= n; i++) { var v = Read(); a[i] = v[0]; b[i] = v[1]; } var ab = FFT.Convolution(a, b); Console.WriteLine(string.Join("\n", ab[1..]));
static void Main() { var h = Console.ReadLine().Split(); char[] sa = h[0].ToCharArray(), sb = h[1].ToCharArray(); var neg_a = sa[0] == '-'; var neg_b = sb[0] == '-'; var neg_ab = neg_a ^ neg_b; var a = Array.ConvertAll(sa, c => (long)(c - '0')); var b = Array.ConvertAll(sb, c => (long)(c - '0')); Array.Reverse(a); Array.Reverse(b); if (neg_a) { Array.Resize(ref a, a.Length - 1); } if (neg_b) { Array.Resize(ref b, b.Length - 1); } var ab = FFT.Convolution(a, b); for (int i = 0; i < ab.Length - 1; i++) { if (ab[i] < 10) { continue; } ab[i + 1] += ab[i] / 10; ab[i] %= 10; } Console.WriteLine(ToString(ab, neg_ab)); }
static object Solve() { var n = int.Parse(Console.ReadLine()); var a = ReadL(); // g^{p-1} == 1 var pg = new long[p - 1]; var pgMap = new long[p]; pg[0] = 1; for (int i = 1; i < pg.Length; i++) { pg[i] = pg[i - 1] * g % p; pgMap[pg[i]] = i; } var r = 0L; var c = new long[p - 1]; foreach (var x in a) { if (x == 0) { continue; } c[pgMap[x]]++; r -= x * x % p; } var conv = FFT.Convolution(c, c); for (int i = 0; i < conv.Length; i++) { r += conv[i] * pg[i % (p - 1)]; } return(r / 2); }