OSDN Git Service

优化取模运算的次数
authorEndlessCheng <loli.con@qq.com>
Sat, 26 Dec 2020 03:12:13 +0000 (11:12 +0800)
committerGitHub <noreply@github.com>
Sat, 26 Dec 2020 03:12:13 +0000 (11:12 +0800)
docs/math/poly/lagrange.md

index 4b7c5a6..6d8a2b9 100644 (file)
@@ -62,36 +62,37 @@ $$
 ### 代码实现
 
 ```cpp
-#include <algorithm>
 #include <cstdio>
-#include <cstring>
+
 const int maxn = 2010;
 using ll = long long;
 ll mod = 998244353;
 ll n, k, x[maxn], y[maxn], ans, s1, s2;
-ll powmod(ll a, ll x) {
-  ll ret = 1ll, nww = a;
-  while (x) {
-    if (x & 1) ret = ret * nww % mod;
-    nww = nww * nww % mod;
-    x >>= 1;
-  }
-  return ret;
+
+ll powmod(ll x, ll n) {
+    ll ret = 1ll;
+    while (n) {
+        if (n & 1) ret = ret * x % mod;
+        x = x * x % mod;
+        n >>= 1;
+    }
+    return ret;
 }
+
 ll inv(ll x) { return powmod(x, mod - 2); }
+
 int main() {
-  scanf("%lld%lld", &n, &k);
-  for (int i = 1; i <= n; i++) scanf("%lld%lld", x + i, y + i);
-  for (int i = 1; i <= n; i++) {
-    s1 = y[i] % mod;
-    s2 = 1ll;
-    for (int j = 1; j <= n; j++)
-      if (i != j)
-        s1 = s1 * (k - x[j]) % mod, s2 = s2 * ((x[i] - x[j] % mod) % mod) % mod;
-    ans += s1 * inv(s2) % mod;
-    ans = (ans + mod) % mod;
-  }
-  printf("%lld\n", ans);
-  return 0;
+    scanf("%lld%lld", &n, &k);
+    for (int i = 1; i <= n; i++) scanf("%lld%lld", x + i, y + i);
+    for (int i = 1; i <= n; i++) {
+        s1 = y[i] % mod;
+        s2 = 1ll;
+        for (int j = 1; j <= n; j++)
+            if (i != j)
+                s1 = s1 * (k - x[j]) % mod, s2 = s2 * (x[i] - x[j]) % mod;
+        ans += s1 * inv(s2) % mod;
+    }
+    printf("%lld\n", (ans % mod + mod) % mod);
+    return 0;
 }
 ```