dalao助我

题目:https://www.luogu.com.cn/problem/P5591
我的代码(A了一个点,其他MLE):

#include <iostream>
#include <vector>

using namespace std;

const int MOD = 998244353;

long long mod_exp(long long base, long long exp, long long mod) {
	long long res = 1;
	while (exp > 0) {
		if (exp % 2 == 1) {
			res = (res * base) % mod;
		}
		base = (base * base) % mod;
		exp /= 2;
	}
	return res;
}

void fac(int n, vector<long long>& fact, vector<long long>& inv_fact) {
	fact.resize(n + 1);
	inv_fact.resize(n + 1);
	fact[0] = 1;
	for (int i = 1; i <= n; ++i) {
		fact[i] = fact[i - 1] * i % MOD;
	}
	inv_fact[n] = mod_exp(fact[n], MOD - 2, MOD);
	for (int i = n - 1; i >= 0; --i) {
		inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;
	}
}

long long pig(int n, int k, const vector<long long>& fact, const vector<long long>& inv_fact) {
	if (k < 0 || k > n) return 0;
	return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD;
}

long long solve(int n, int p, int k) {
	vector<long long> fact, inv_fact;
	fac(n, fact, inv_fact);
	
	long long res = 0;
	for (int i = 0; i <= n; ++i) {
		long long comb = pig(n, i, fact, inv_fact);
		
		long long power = mod_exp(p, i, MOD);
		
		long long floor_val = i / k;
		
		res = (res + comb * power % MOD * floor_val % MOD) % MOD;
	}
	
	return res;
}

int main() 
{
	int n, p, k;
	cin >> n >> p >> k;
	
	long long ans = solve(n, p, k);
	cout << ans;
	
	return 0;
}

@金杭东 @2345安全卫士 神犇救我

1 个赞

我数论不好。
而且还黑

1 个赞

水黑也不会,建议看一波TJ理解理解

1 个赞

卷黑题%%%%

1 个赞

复杂度错误

1 个赞

那咋搞

不知道

数论还黑题,不会+不会

论坛就没人会这题,关键洛谷讨论区还没了

1 个赞

就算洛谷讨论区还活着,大佬们估计也在为省选紧张

建议翻 tj or 找巨佬
这个复杂度明显错误

1 个赞

等我一下我去找大佬

1 个赞

a?

我等会尽量给你摇人

这种没人调的,复杂度显然错误,建议别做了

stop,你这纯暴力吧

aaa,我要看tj

不完全纯,有逆元优化

建议别做了,大佬不会
image

这是谁啊

1 个赞