ãã FFT ã使ãã° ã§ãã§ããããå®éã¯
ã§éã«åãã
åé¡æ¦è¦
æ£ã®ç´ æ° ã¨ãæ£ã®æ´æ°
ãä¸ããããã
ã¯
以ä¸
以ä¸ã®æ´æ°
ãæºãããã㪠ã®çµã®åæ°ãæ±ããã
å¶ç´
ã¯ç´ æ°
èãããã¨
ã¾ãã¯æ¬¡ã®ããã«éè¨å¦çããããããã®ããã«ããããä½åããããã¨ããæ å ±ã«å¤æãã¦èããã®ã¯å ¸åï¼ï¼
num[v]
âã¨ãªããããªæ´æ°
(
) ã®åæ°
ããã¯ç¹°ãè¿ãäºä¹æ³ã§è¨ç®ããã° ã§ã§ããã
çµ±åãã
é å num ãæ±ããããããããã使ã£ã¦æ¬¡ã®é åãæ±ãããã
num2[v]
âã¨ãªããããªæ´æ°
ã®çµã®åæ°
ããã¯åç´ã«ã¯æ¬¡ã®ãããªå¦ç㧠ã§æ±ããããï¼
vector<long long> num2(P, 0); for (int u = 0; u < P; ++u) { for (int v = 0; v < P; ++v) { num2[(u+v)%P] += num[u] + num[v]; } }
ãããæ±ãã¦ããã°ããã¨ã¯çãã¯æ¬¡ã®ããã«æ±ããããã
long long res = 0; for (int v = 0; v < P; ++v) { res += num2[v] + num[v]; }
ã³ã¼ã
è¨ç®é㯠ã¨ãªãã
ãªããnum2 ãæ±ããé¨åã¯ãFFT ãç¨ããã° ã§ã§ããããã£ã¦ãã®åé¡ã¯
ã§ãã§ããã®ã§ã
,
ã§ã解ããã
#include <bits/stdc++.h> using namespace std; long long modpow(long long a, long long n, long long mod) { long long res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } int main() { long long P, N; cin >> P >> N; vector<long long> num(P, 0), num2(P, 0); for (int v = 0; v < P; ++v) num[modpow(v, N, P)]++; for (int u = 0; u < P; ++u) { for (int v = 0; v < P; ++v) { int s = (u + v >= P ? u + v - P : u + v); num2[s] += num[u] * num[v]; } } long long res = 0; for (int v = 0; v < P; ++v) res += num2[v] * num[v]; cout << res << endl; }