bingxuan9112

多項式插值 盡量別用快速冪

Aug 13th, 2019
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const ll N = 3000;
  6.  
  7. ll p,dp[N][N];
  8. ll f[N]={1},t[N],ans[N],inv[N];
  9. signed main(){
  10.     ios_base::sync_with_stdio(0), cin.tie(0);
  11.     cin >> p;
  12.     for(int i = 0; i < p; i++) cin >> dp[1][i];
  13.     for(int i = 1; i < p; i++) for(int j = 1; j <= i; j++) if(i*j%p==1) inv[i]=j, inv[j]=i;
  14.     for(int L = 2; L <= p; L++) {
  15.         for(int i = 0; i+1 < p; i++) {
  16.             dp[L][i] = (dp[L-1][i+1] - dp[L-1][i] + p) * inv[L-1] % p;
  17.         }
  18.     }
  19.     for(int i = 0; i < p; i++) {
  20.         for(int j = 0; j < p; j++) ans[j] = (ans[j]+dp[i+1][0]*f[j])%p;
  21.         t[0] = (p-i)*f[0]%p;
  22.         for(int j = 1; j < p; j++) t[j] = (f[j-1] - i*f[j]%p + p)%p;
  23.         for(int j = 0; j < p; j++) f[j] = t[j];
  24.     }
  25.     for(int i = 0; i < p; i++) cout << ans[i] << " \n"[i==p-1];
  26. }
Advertisement
Add Comment
Please, Sign In to add comment