Exemplo n.º 1
0
		fenwickTree(LL N): n(N) {
			LL val;
			tree.resize(n + 10, 0);
			for (LL i = 0; i < n; i++) {
				SLL(val);
				update(i, val);
			}
		}
Exemplo n.º 2
0
int main()
{
	getFactors();
	LL t, n, m, q, r;
	SLL(t);
	while (t--)
	{
		nr.clear();
		dr.clear();
		SLL(n), SLL(m), SLL(q);
		if (n <= 500)
		{
			query.resize(q);
			answers.resize(q);
			for (LL i = 0; i < q; i++)
			{
				SLL(r);
				query[i] = mp(min(r, n - r), i);
			}
			sortv(query);
			LL lim, start = 1, end = n;
			for (LL i = 0; i < q; i++)
			{
				lim = query[i].f;
				for (; start <= lim; start++)
				{
					LL sz = factor[start].size();
					for (LL k = 0; k < sz; k++)
					{
						LL val = factor[start][k].f;
						LL v = dr[val];
						v += factor[start][k].s;
						dr[val] = v;
					}
				}
				start = lim + 1;
				for (; end >= n - lim + 1; end--)
				{
					LL sz = factor[end].size();
					for (LL k = 0; k < sz; k++)
					{
						LL val = factor[end][k].f;
						LL v = nr[val];
						v += factor[end][k].s;
						nr[val] = v;
					}
				}
				end = n - lim;
				LL ans = 1;
				for (map_it = nr.begin(); map_it != nr.end(); map_it++)
				{
					LL prod = powMod(map_it->first, map_it->second - dr[map_it->first], m);
					ans = (ans * prod) % m;
				}
				if (ans < 0)
					ans += m;
				answers[query[i].s] = ans;
			}
			for (LL i = 0; i < q; i++)
				printf("%lld\n", answers[i]);
		}
		else
		{
			powers.resize(n + 1);
			inverse.resize(n + 1);
			answers.resize(n + 1);
			inverse[0] = powers[0] = 1;
			LL phi = etf(m);
			for (LL i = 1; i <= n; i++)
			{
				powers[i] = powMod(i%m, i, m);
				inverse[i] = powMod(powMod(i, phi - 1, m), i, m);
			}
			answers[1] = answers[n - 1] = powers[n];
			for (LL i = 2; i <= n/2; i++)
			{
				LL val = answers[i - 1];
				val = (val * powers[n - i + 1]) % m;
				val = (val * inverse[i]) % m;
				answers[i] = answers[n - i] = val;
			}
			while (q--)
			{
				SLL(r);
				printf("%lld\n", answers[r]);
			}
		}
	}
	return 0;
}