QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#406829#5099. 朝圣道_l_l_Compile Error//C++142.6kb2024-05-07 19:05:542024-05-07 19:05:58

Judging History

This is the latest submission verdict.

  • [2024-05-07 19:05:58]
  • Judged
  • [2024-05-07 19:05:54]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
void init(int o, int p);
int ask(long long n);
int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int o, T, p;
	std::cin >> o >> T >> p;
	init(o, p);
	for (int i = 1; i <= T; i++) {
		long long n;
		std::cin >> n;
		std::cout << ask(n) << '\n';
	}
	return 0;
}
int exgcd(int a, int b, int &x, int &y) {
	if (b == 0) return x = 1, y = 0, a;
	int g = exgcd(b, a % b, y, x); y -= a / b * x; return g;
}
int inv(int a, int p) {int x, y; exgcd(a, p, x, y); return (x % p + p) % p;}
int qkpow(int a, int b) {int ans = 1; for (; b; b >>= 1, a *= a) if (b & 1) ans *= a; return ans;}
struct sub {
	vector<int> muls, invn; int p, k, pk, pw[4][32001];
	void init(int p_, int k_) {
		p = p_; k = k_; pk = qkpow(p, k); muls.resize(pk); muls[0] = 1;
		for (int i = 1; i < pk; i++) muls[i] = i % p ? 1ll * muls[i - 1] * i % pk : muls[i - 1];
		invn.resize(pk); for (int i = 1; i < pk; i++) invn[i] = inv(i, pk);
		pw[0][0] = pw[1][0] = pw[2][0] = pw[3][0] = 1;
		for (int i = 1; i <= 32000; i++) pw[0][i] = 1ll * pw[0][i - 1] * (pk + 1) / 2 * (pk + 1) / 2 % pk;
		for (int i = 1; i <= 32000; i++) pw[1][i] = 1ll * pw[1][i - 1] * pw[0][32000] % pk;
		for (int i = 1; i <= 32000; i++) pw[2][i] = 1ll * pw[2][i - 1] * pw[1][32000] % pk;
		for (int i = 1; i <= 32000; i++) pw[3][i] = 1ll * pw[3][i - 1] * pw[2][32000] % pk;
	}
	int getfact(long long n) {
		if (n < p) return muls[n];
		else if (n / pk & 1) return pk - 1ll * muls[n % pk] * getfact(n / p) % pk;
		else return 1ll * muls[n % pk] * getfact(n / p) % pk;
	}
	int C(long long n) {
		long long cnt = 0;
		for (long long x = 2 * n; x; cnt += (x /= p));
		for (long long x = n; x; cnt -= 2 * (x /= p));
		if (cnt >= k) return 0;
		int tmp = invn[getfact(n)];
		return 1ll * getfact(2 * n) * tmp * tmp % pk * qkpow(p, cnt) % pk;
	}
	int sb(long long n) {
		return 1ll * pw[0][n % 32000] * pw[1][n / 32000 % 32000] *
			pw[2][n / 1024000000 % 32000] % pk * pw[3][n / 32768000000000ll] % pk;
	}
} cnm[7];
int o, p, m;
vector<int> plist, pnum; int Ml[7];
void init(int o_, int p_) {
	o = o_, p = p_;
	for (int i = 2; i * i <= p_; i++) if (p_ % i == 0) {
		plist.push_back(i); pnum.push_back(0); while (p_ % i == 0) p_ /= i, pnum.back()++;
	}
	if (p_ > 1) plist.push_back(p_), pnum.push_back(1);
	m = plist.size(); for (int i = 0; i < m; i++) cnm[i].init(plist[i], pnum[i]);
	for (int i = 0; i < m; i++) Ml[i] = p / cnm[i].pk * inv(p / cnm[i].pk, cnm[i].pk);
}
int ask(long long n) {
	long long ans = 0;
	for (int i = 0; i < m; i++) {
		int ret = 1ll * cnm[i].C(n) * (n % cnm[i].pk) * cnm[i].sb(n) % cnm[i].pk;
		ans += 1ll * ret * Ml[i];
	}
	return ans % p;
}

详细

/usr/bin/ld: /tmp/ccatsnJd.o: in function `main':
answer.code:(.text.startup+0x0): multiple definition of `main'; /tmp/cct1B83d.o:implementer.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status