結果
| 問題 |
No.1025 Modular Equation
|
| コンテスト | |
| ユーザー |
sbite
|
| 提出日時 | 2020-04-10 22:33:49 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,186 bytes |
| コンパイル時間 | 10,119 ms |
| コンパイル使用メモリ | 265,124 KB |
| 最終ジャッジ日時 | 2025-01-09 16:22:29 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 TLE * 1 |
| other | RE * 1 TLE * 31 |
ソースコード
#include <bits/stdc++.h>
#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (int i = (a); i < (b); ++i)
#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define ALL(x) x.begin(), x.end()
#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
using namespace std;
random_device rnd;
mt19937 mt(rnd());
using ll = long long;
using lld = long double;
using VI = vector<int>;
using VVI = vector<VI>;
using VL = vector<ll>;
using VVL = vector<VL>;
using PII = pair<int, int>;
const double EPS = 1e-3;
const double PI = 3.1415926535897932384626433832795028841971;
const int IINF = 1 << 30;
const ll INF = 1ll << 60;
const ll MOD = 1000000007;
VVL nums(330, VL(101010, {}));
ll p, n, k, b;
VL v(101010);
void fft(vector<complex<long double>> &v)
{
int n = (int)v.size();
if (n <= 1)
return;
int half = n / 2;
vector<complex<long double>> even(half), odd(half);
//assert(half * 2 == n);
complex<long double> w = polar((lld)1.0, -2.0 * PI / (long double)n);
long double arg = -2.0 * PI / (long double)n;
for (int i = 0; i < half; i++)
{
even[i] = v[i] + v[half + i];
auto tmp = (v[i] - v[half + i]); // * pow(w, i);
long double wr = cos(arg * i);
long double wi = sin(arg * i);
odd[i].real(tmp.real() * wr - tmp.imag() * wi);
odd[i].imag(tmp.real() * wi + tmp.imag() * wr);
}
fft(even);
fft(odd);
for (int i = 0; i < half; i++)
{
v[2 * i] = even[i];
v[2 * i + 1] = odd[i];
}
}
void ifft(vector<complex<long double>> &v)
{
int n = (int)v.size();
for (auto &x : v)
x = conj(x);
fft(v);
for (auto &x : v)
x = conj(x) / (long double)n;
}
int pow2_at_least(int n)
{
int ret = 1;
while (ret < n)
ret *= 2;
return ret;
}
vector<ll> convolution(vector<ll> &a, vector<ll> &b)
{
int n = pow2_at_least(2 * (int)max(a.size(), b.size()) + 1);
vector<complex<long double>> x(n, (0, 0)), y(n, (0, 0));
vector<ll> c(n, 0);
rep(i, a.size())
{
x[i].real(a[i]);
}
rep(i, b.size())
{
y[i].real(b[i]);
}
fft(x);
fft(y);
rep(i, n)
{
y[i] = x[i] * y[i];
}
ifft(y);
rep(i, n)
{
c[i] = round(y[i].real());
}
return c;
}
ll pmod(ll base, ll n)
{
if (n == 0)
return 1;
ll prev = pmod(base, n / 2);
if (n % 2 == 0)
{
return (prev * prev) % p;
}
else
{
return (prev * prev * base) % p;
}
}
int main()
{
cin >> p >> n >> k >> b;
rep(i, n) cin >> v[i];
ll tmp;
rep(i, n)
{
rep(j, p)
{
tmp = pmod(j, k);
tmp = (tmp * v[i]) % p;
nums[i][tmp]++;
}
}
VL ans = nums[0];
//cerr << "calc" << endl;
rep(i, 1, n)
{
VL nans = convolution(ans, nums[i]);
rep(j, p)
{
ans[j] = 0;
}
rep(j, nans.size())
{
ans[j % p] += nans[j] % MOD;
ans[j % p] %= MOD;
}
}
cout << ans[b] << endl;
return 0;
}
sbite